Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Grupowanie i wybór maksymalnej wartości
alekto
post 18.06.2013, 22:31:57
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.06.2013

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


tabela1
id_klienta / status / data
1 / oplacone / 2013-05-20
1 / wyslane / 2013-05-15
1 / anulowane / 2013-05-10
2 / anulowane / 2013-05-25
2 / oplacone / 2013-05-20
3 / wyslane / 2013-05-22
3 / wyslane / 2013-05-10

Chcę, by wynik pokazał tylko takich klientów, których ostatnie (najnowsze wg kolumny "data") zamowienie, ma status "oplacone". Z powyzszej tabeli tylko klient o id 1 spełnia ten warunek. Jak powinno wyglądać takie zapytanie?

niestety nie zaszłam z tym daleko;)

SELECT id_klienta, max(data)
from tabela1
group by id_klienta
Go to the top of the page
+Quote Post
b4rt3kk
post 18.06.2013, 23:14:07
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


  1. SELECT id_klienta, MAX(DATA) FROM tabela1 WHERE STATUS = 'oplacone' GROUP BY id_klienta


Ewentualnie:

  1. SELECT id_klienta, DATA FROM tabela1 WHERE STATUS = 'oplacone' ORDER BY DATA DESC GROUP BY id_klienta


Ten post edytował b4rt3kk 18.06.2013, 23:17:24


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
Damonsson
post 18.06.2013, 23:22:24
Post #3





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

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


@up: głupoty


  1. SELECT * FROM tabela1
  2. GROUP BY id_klienta
  3. HAVING `status`='oplacone'


Jeśli jednak daty będziesz mieć pomieszane, nie w kolejności w bazie, to musisz najpierw wydobyć najnowszy wpis, a dopiero później grupować i użyć having np tak

  1. SELECT *
  2. FROM (
  3. SELECT *
  4. FROM tabela1
  5. ORDER BY `data` DESC
  6. ) AS sub
  7. GROUP BY id_klienta
  8. HAVING `status`='oplacone'


Ten post edytował Damonsson 18.06.2013, 23:23:45
Go to the top of the page
+Quote Post
b4rt3kk
post 18.06.2013, 23:29:44
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


@up: głupoty. Po co używać HAVING kiedy nie używasz funkcji agregującej i to do zwykłego porównania (=)? Zwykłe WHERE jest wystarczające.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
Damonsson
post 18.06.2013, 23:31:54
Post #5





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

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


Prześpij się i przemyśl to co napisałeś jak będziesz wypoczęty wink.gif
Go to the top of the page
+Quote Post
mmmmmmm
post 19.06.2013, 07:07:15
Post #6





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

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


  1. SELECT t.* FROM tabela1 t JOIN (SELECT id_klienta, max(DATA) DATA FROM tabela1 GROUP BY 1) x ON x.id_klienta=t.id_klienta AND x.DATA=t.DATA WHERE t.STATUS='oplacone'
Go to the top of the page
+Quote Post
alekto
post 19.06.2013, 09:24:02
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.06.2013

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


Cytat(Damonsson @ 19.06.2013, 00:22:24 ) *
Jeśli jednak daty będziesz mieć pomieszane, nie w kolejności w bazie, to musisz najpierw wydobyć najnowszy wpis, a dopiero później grupować i użyć having np tak

  1. SELECT *
  2. FROM (
  3. SELECT *
  4. FROM tabela1
  5. ORDER BY `data` DESC
  6. ) AS sub
  7. GROUP BY id_klienta
  8. HAVING `status`='oplacone'



To się świetnie sprawdziło - dzięki!
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 Wersja Lo-Fi Aktualny czas: 28.05.2025 - 23:39