Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] skomplikowe zapytanie
Forum PHP.pl > Forum > Przedszkole
agataperz
Cześć,

wlasnie stworzylam sobie skrypt ktory zmienia mi automatyczne statusy. Niestety stanełam nad zapytaniem do bazy sql.
Poniższe zapytanie wyświetla mi poprawnie rekordy: id_order, tracking_number i ostatnią date date_add z tabeli ps_order_history ale już id_order_state z tabeli ps_order_history wyswietla mi dowolna wartosc z roznych rekordow a ja bym chciala ażeby wyświetlał ostatnią pozycję odpowiadającą rekordowi date_add.
Z tego co wiem powinnam zrobić zapytanie w zapytaniu. Czy pomożecie mi dojść do rozwiązania problemu?

  1. SELECT ps_order_history.id_order, ps_order_carrier.tracking_number, max(ps_order_history.date_add), ps_order_history.id_order_state FROM ps_order_carrier INNER JOIN ps_order_history USING ( id_order ) WHERE ps_order_carrier.id_carrier IN (48,55) AND ps_order_history.id_order_state IN (4, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26)
timon27
zamiast "MAX" użyj "ORDER BY ps_order_history.date_add DESC" oraz "LIMIT 1"
agataperz
niestety LIMIT 1 automatycznie mi zablokuje wszystkie pozostałe rekordy id_order których może być duuużo smile.gif

dla ulatwienia ponizej przedstawiam tabele

ps_order_history
id_order_history id_employee id_order id_order_state date_add
1 0 1 1 2014-04-28 15:25:26
2 0 2 10 2014-04-29 11:16:46
3 0 3 13 2014-05-03 17:30:55
4 0 4 1 2014-06-27 16:44:29
5 1 4 2 2014-07-05 12:24:46


ps_order_carrier
id_order_carrier id_order id_carrier id_order_invoice weight shipping_cost_tax_excl shipping_cost_tax_incl tracking_number date_add
1 1 2 0 0.000000 0.000000 0.000000 2014-04-28 15:25:36
2 2 13 0 108.000000 8.850000 10.890000 2014-04-29 11:16:46
3 3 13 2 4.000000 8.850000 10.890000 2014-05-03 17:30:55
4 4 30 1 1.200000 5.000000 6.150000 2014-06-27 16:44:28
5 5 29 3 2.000000 11.500000 14.150000 2014-07-05 23:41:19
6 6 29 4 1.200000 11.500000 14.150000 2014-07-06 12:35:11
7 7 32 0 1.200000 11.000000 13.530000 2014-07-06 21:50:11
8 8 56 5 0.235000 17.070000 20.990000 2014-07-18 13:04:29
9 9 38 6 0.235000 13.000000 15.990000 2014-07-26 14:07:49
10 10 67 7 1.200000 16.500000 20.300000 330825320 2014-07-29 19:32:34
11 11 71 0 0.235000 12.000000 14.760000 2014-07-29 20:30:29
12 12 71 0 0.235000 12.000000 14.760000 2014-07-29 20:49:30
13 13 48 8 0.500000 3.240000 3.990000 664920233460004119904133 2014-08-19 13:22:01

mmmmmmm
Brakuje ci GROUP BY...
timon27
Cytat(mmmmmmm @ 23.08.2014, 20:21:14 ) *
Brakuje ci GROUP BY...

GROUP BY nie jest konieczne. Jeśli korzysta się z funkcji np. MAX to automatycznie grupuje do 1 linijki.
I myślałem że tak chce agataperz.
A tu nagle:
Cytat(agataperz @ 23.08.2014, 18:28:53 ) *
niestety LIMIT 1 automatycznie mi zablokuje wszystkie pozostałe rekordy id_order których może być duuużo smile.gif

Czyli jednak chce więcej linijek.

agata zdecyduj co chcesz: jedną linijkę, czy grupowanie, jak drugie to czemu nie ma tego w zapytaniu?
mmmmmmm
Cytat(timon27 @ 24.08.2014, 03:38:52 ) *
GROUP BY nie jest konieczne. Jeśli korzysta się z funkcji np. MAX to automatycznie grupuje do 1 linijki.

Glupoty gadasz.
timon27
Cytat(mmmmmmm @ 24.08.2014, 19:46:48 ) *
Glupoty gadasz.


Żeby nie gadać głupot specjalnie wszedłem w phpmyadmin i odpytałem bazę:
  1. SELECT max(stan) FROM towary

Tabela towary ma tysiące wierszy. Zgadnij ile wierszy wypluło zapytanie?
Jeden.
Może to jakieś ustawienia mysql, ale miałem tak w hekko, było tak w dih.pl.

Tak samo przy wszystkich funkcjach agregujących
mmmmmmm
Ale nie w przypadku, gdy przed MAX(stan) miałbys wymienione inne pola.
Poza tym domyślnie MySQl jest źle skonfigurowany. Nie ma SQL_MODE= ANSI
timon27
Cytat(mmmmmmm @ 24.08.2014, 21:50:56 ) *
Ale nie w przypadku, gdy przed MAX(stan) miałbys wymienione inne pola.


Zobaczmy:
  1. SELECT nazwa, max(stan) FROM towary

Nope, dalej jedna linijka.


Cytat(mmmmmmm @ 24.08.2014, 21:50:56 ) *
Poza tym domyślnie MySQl jest źle skonfigurowany. Nie ma SQL_MODE= ANSI


Co to znaczy 'źle'? To po co wybór sql_mode, skoro istnieje 'jedyny słuszny'?
nospor
Cytat
Co to znaczy 'źle'? To po co wybór sql_mode, skoro istnieje 'jedyny słuszny'?
Bo mmmmmmm uznaje tylko jeden "słuszny" i już nie raz na tym forum powodował przez to założenie niepotrzebne problemy... Nie dociera do niego, że nie jest to standardowe ustawienie i zdecydowana wiekszosc ludzi pracuje na normalnym ustawieniu.
mmmmmmm
  1. CREATE TABLE mmmmm
  2. (
  3. id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  4. nazwa varchar(20) NOT NULL UNIQUE,
  5. stan integer NOT NULL
  6. );
  7. INSERT INTO mmmmm(nazwa, stan) VALUES('3 szt', 3), ('towar o stanie 20', 20), ('towar - 2 szt.', 2);
  8.  
  9. SELECT nazwa, max(stan) FROM mmmmm;

Wynik:
'3 szt.', 20
Ni z gruszki, ni z pietruszki.
Damonsson
Jakby policzyć Twój wyimaginowany wiersz "Ni z gruszki, ni z pietruszki". To rzeczywiście zwraca więcej niż 1 wiersz. Ale to sprawa bardziej dla jakiegoś lekarza, że widzisz wiersze, które nie istnieją wink.gif
mmmmmmm
Cytat(Damonsson @ 25.08.2014, 10:18:18 ) *
Jakby policzyć Twój wyimaginowany wiersz "Ni z gruszki, ni z pietruszki". To rzeczywiście zwraca więcej niż 1 wiersz. Ale to sprawa bardziej dla jakiegoś lekarza, że widzisz wiersze, które nie istnieją wink.gif

A coś sensownego umiesz dodać?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.