Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL] skomplikowe zapytanie
agataperz
post
Post #1





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 24.03.2009
Skąd: Hamburg DE

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


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)


Ten post edytował agataperz 23.08.2014, 17:05:26
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
timon27
post
Post #2





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

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


zamiast "MAX" użyj "ORDER BY ps_order_history.date_add DESC" oraz "LIMIT 1"

Ten post edytował timon27 23.08.2014, 17:08:24
Go to the top of the page
+Quote Post
agataperz
post
Post #3





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 24.03.2009
Skąd: Hamburg DE

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


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



Ten post edytował agataperz 23.08.2014, 17:38:07
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Brakuje ci GROUP BY...
Go to the top of the page
+Quote Post
timon27
post
Post #5





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

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


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?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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.
Go to the top of the page
+Quote Post
timon27
post
Post #7





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

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


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

Ten post edytował timon27 24.08.2014, 19:45:23
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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
Go to the top of the page
+Quote Post
timon27
post
Post #9





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

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


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'?

Ten post edytował timon27 24.08.2014, 22:09:56
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #11





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  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.
Go to the top of the page
+Quote Post
Damonsson
post
Post #12





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


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
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #13





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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ć?
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 09:20