Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Grupowanie, sortowanie, ostatnie 3 wyniki MySQL
diodadioda
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


Witam po raz pierwszy
Niestety poległem w prostej sprawie, jak mi się przynajmniej wydawało..:
Mam następującą tabelę zakupu2014:


|id |indeks |nazwa_towaru |jm |il0osc |cena_zakupu |nazwa_kontrahenta |data_realizacji|
|0 |121 |aaa |kg |12 |12.1 |hh |2014-01-24|
|1 |121 |aaa |kg |12 |13.1 |hh |2014-01-23|
|2 |122 |bbb |szt |12 |14.1 |hh |2014-01-24|
|3 |121 |aaa |kg |12 |10.1 |hh |2014-01-01|
|4 |122 |bbb |szt|12 |9.1 |hh |2014-01-10|
|5 |122 |bbb |szt|12 |1.1 |hh |2014-01-12|

potrzebuje osiągnąc taki wynik jak daje:
Select indeks,cena_zakupu,avg(cena_zakupu),min(cena_zakupu)
from zakupy2014
group by indeks

ale zamiast np avg ostatnią cenę zakupu, przedostatnia cenę zakupu i przedprzedostatnia cenę zakupu -w jednym rekordzie jak to jest właśnie w tym zapytaniu
Oczywiście biorę po uwagę wariant ze zbudowaniem osobnej tabeli z takimi wynikami.
Podkreślam, że dla niektórych indeksów może być tylko ostatnia cena_zakupu.
Ma ktoś pomysł jak to rozwiązać?
Pozdrawiam

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kartin
post
Post #2





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

Ostrzeżenie: (0%)
-----


  1. SELECT <co_ci_trzeba> FROM tabela ORDER BY id DESC LIMIT 3
To zapytanie zwróci informacje o trzech wierszach największym id. Wcale nie muszą to być trzy ostatnie zakupy.

Cytat(diodadioda @ 16.06.2014, 23:14:51 ) *
Dzięki za podpowiedź ale dalej nie wiem jak skonstruować warunki do tego, żeby było poprawnie.
Same zapytanie jest niepoprawne więc warunki w nim nic nie pomogą.

Swoją drogą to tabela też nie jest poprawna - np. możesz dopisać towar raz w litrach, a przy kolejnym zakupie w kg. Chyba, że jest to celowe. Jeśli nie to poczytaj o postaciach normalnych.

Jeśli zależy ci na wydajności to trzy ostatnie ceny możesz przechowywać w osobnej tabeli. Ich aktualizacje najwygodniej obsłużyć bezpośrednio w bazie danych, za pomocą wyzwalaczy.
  1. CREATE INDEX indeks
  2. ON zakupy2014 (indeks);
  3.  
  4. CREATE TABLE `ostatnie_ceny` (
  5. `indeks` int(11) NOT NULL,
  6. `cena_ost` decimal(8,2) NOT NULL,
  7. `cena_przedost` decimal(8,2) DEFAULT NULL,
  8. `cena_przedprzedost` decimal(8,2) DEFAULT NULL,
  9. PRIMARY KEY (`indeks`),
  10. FOREIGN KEY (`indeks`) REFERENCES `zakupy2014` (`indeks`) ON DELETE CASCADE ON UPDATE CASCADE
  11. ) ENGINE=InnoDB;
  12.  
  13. DROP TRIGGER IF EXISTS ostatnie_ceny;
  14. DELIMITER //
  15.  
  16. CREATE TRIGGER ostatnie_ceny AFTER INSERT ON zakupy2014 FOR EACH ROW
  17. BEGIN
  18. DECLARE v_cena_przedost, v_cena_przedprzedost DECIMAL(8,2) DEFAULT NULL;
  19.  
  20. SELECT cena_ost, cena_przedost INTO v_cena_przedost, v_cena_przedprzedost
  21. FROM ostatnie_ceny
  22. WHERE indeks = NEW.indeks;
  23.  
  24. REPLACE ostatnie_ceny (indeks, cena_ost, cena_przedost, cena_przedprzedost)
  25. VALUE (NEW.indeks, NEW.cena_zakupu, v_cena_przedost, v_cena_przedprzedost);
  26. END//
  27. DELIMITER ;
Trzeba wziąć pod uwagę, że dane w tabeli mogą być zaktualizowane lub usunięte więc i dla tych zdarzeń trzeba napisać wyzwalacze. Jeśli masz pewnośc, że nie będzie żadnych aktualizacji lub kasowania wtedy to co jest wystarczy.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 04:39