Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Podzapytania z użyciem MAX, dlaczego operator "=" nie działa?
qweluke
post
Post #1





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 25.03.2010
Skąd: Radom

Ostrzeżenie: (10%)
X----


Witam,

Takim zapytaniem
  1. SELECT uzytkownicy.id, MAX( graf.id_graf ) AS maksik, id_uzytkownika, id_graf, miesiac
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = graf.id_uzytkownika
  4. AND id_graf = 'maksik'
  5. GROUP BY uzytkownicy.id
  6. ORDER BY nazwisko ASC


Dostaje coś takigo
(IMG:http://i.imgur.com/2mL6M.jpg)

Co oczywiście jest nieprawdą, gdyż przy użyciu takiego zapytania

  1. SELECT uzytkownicy.id, MAX( graf.id_graf ) AS maksik, id_uzytkownika, id_graf, miesiac
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = grafik.id_uzytkownika
  4. GROUP BY uzytkownicy.id
  5. ORDER BY nazwisko ASC


zwraca mi:
(IMG:http://i.imgur.com/ENHzq.jpg)


A tak wygląda tabela "graf":
(IMG:http://i.imgur.com/Ok9We.jpg)

---------------------------------------
1. Ktoś mi może wytłumaczyć dlaczego porównanie z pierwszej opcji nie wyciąga prawidłowych danych?
2. Jak zatem powinno brzmieć zapytanie, aby dla każdego użytkownika pobrać wpis gdzie id_graf jest największe?

Ten post edytował qweluke 20.09.2011, 12:44:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post
Post #2





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




Ale ty tak na poważnie? Porównujesz id_graf do tekstu 'maksik' ale w twoich zrzutach widać jak wół że id_graf jest liczbą :/

edit: 'maksik' a alias maksik z max to dwie różne rzeczy.
Jak chcesz używać porównywać funkcje grupujące w group by to masz to robić w HAVING i masz używać funkcji a nie żadnych tekstów maksik
Go to the top of the page
+Quote Post
qweluke
post
Post #3





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 25.03.2010
Skąd: Radom

Ostrzeżenie: (10%)
X----


Cytat(nospor @ 20.09.2011, 10:38:26 ) *
Ale ty tak na poważnie? Porównujesz id_graf do tekstu 'maksik' ale w twoich zrzutach widać jak wół że id_graf jest liczbą :/

edit: 'maksik' a alias maksik z max to dwie różne rzeczy.
Jak chcesz używać porównywać funkcje grupujące w group by to masz to robić w HAVING i masz używać funkcji a nie żadnych tekstów maksik


No bez przesady (IMG:style_emoticons/default/biggrin.gif)
Aż taki głupi to nie jestem ;P

  1. MAX( graf.id_graf ) AS maksik


'maksik' to alias dla 'MAX( graf.id_graf )' ktory jest liczba (IMG:style_emoticons/default/tongue.gif)
moze niepotrzebnei uzylem '' w porownaniu

a nawet jeśli wpisze
  1. SELECT uzytkownicy.id, MAX( graf.id_graf ) AS maksik, id_uzytkownika, id_graf, miesiac
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = graf.id_uzytkownika
  4. AND id_graf = MAX( graf.id_graf )
  5. GROUP BY uzytkownicy.id
  6. ORDER BY nazwisko ASC


to tez nie działa (IMG:style_emoticons/default/sad.gif)

Zaraz potestuję HAVING

Ten post edytował qweluke 20.09.2011, 09:47:48
Go to the top of the page
+Quote Post
nospor
post
Post #4





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




Cytat
Aż taki głupi to nie jestem

Cytat
'maksik' to alias dla 'MAX( graf.id_graf )' ktory jest liczba (IMG:style_emoticons/default/tongue.gif)
Mamy tu dwie sprzeczne informacje (IMG:style_emoticons/default/tongue.gif) (IMG:style_emoticons/default/wink.gif)
'maksik' to tekst. Tekst to nie alias. Alias to maksik. 'maksik' to tekst

'maksik'
maksik
Znajdź 10 różnic.

Cytat
a nawet jeśli wpisze
....

to tez nie działa
Dlatego wspomniałem o having. Możesz też pobawić się podzapytaniem, gdzie będziesz porównywał id_graf do max z podzapytania
Go to the top of the page
+Quote Post
qweluke
post
Post #5





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 25.03.2010
Skąd: Radom

Ostrzeżenie: (10%)
X----


a moge was prosic o jakas podpowiedz jak takie pytanei zadać?
Bo męczę się z tym HAVING ale za każdym razem zwraca mi tylko jeden rekord a nie dla wszystkich id_uzytkownika

probowalem tez podzapytan


  1. SELECT uzytkownicy.id, id_uzytkownika, id_graf, miesiac,
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = graf.id_uzytkownika
  4. AND id_graf = (SELECT MAX( graf.id_graf) FROM graf, uzytkownicy WHERE uzytkownicy.id=graf.id_uzytkownika GROUP BY uzytkownicy.id)
  5. GROUP BY uzytkownicy.id
  6. ORDER BY nazwisko ASC


ale dostaje informacje, ze
  1. Subquery returns more than 1 row

co oczywiście jest prawdą gdyż podzapytanie zwraca wszytkie MAX'y (dla każdego użytkownika)

Ten post edytował qweluke 20.09.2011, 12:08:34
Go to the top of the page
+Quote Post
nospor
post
Post #6





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




Cytat
co oczywiście jest prawdą gdyż podzapytanie zwraca wszytkie MAX'y (dla każdego użytkownika)
Bo podzapytanie masz ograniczyć do aktualnie przetwarzanego użytkownika.

....
AND id_graf = (SELECT MAX( id_graf) FROM graf WHERE id_uzytkownika=uzytkownicy.id)
....
Go to the top of the page
+Quote Post
qweluke
post
Post #7





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 25.03.2010
Skąd: Radom

Ostrzeżenie: (10%)
X----


z tym ze wtedy zwraca mi tylko jeden rekord dla id_uzytkownika = 1, a jeszcze jest pozostałuch 5ciu (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #8





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




No tak.... coś mi się przestawiło we łbie. (IMG:style_emoticons/default/sad.gif)
Powód edycji: [nospor]:
Go to the top of the page
+Quote Post
luckyps
post
Post #9





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


jezeli robisz MAX to dostaniesz tylko jeden rekord.
A jesli nie chcesz pobierac maxymalnego id, tylko kilka to musisz napisac
  1. id_graf IN (...)
no i nie ma sensu w podzapytaniu robic grupowania (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
qweluke
post
Post #10





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 25.03.2010
Skąd: Radom

Ostrzeżenie: (10%)
X----


o! tego mi było trzeba (IMG:style_emoticons/default/biggrin.gif)

  1. SELECT uzytkownicy.id, id_uzytkownika, id_graf, miesiac,
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = graf.id_uzytkownika
  4. AND id_graf IN (SELECT MAX( graf.id_graf) FROM graf, uzytkownicy WHERE uzytkownicy.id=graf.id_uzytkownika AND id_uzytkownika=uzytkownicy.id GROUP BY id)
  5. GROUP BY uzytkownicy.id
  6. ORDER BY nazwisko ASC


teraz śmiga jak ta lala (IMG:style_emoticons/default/biggrin.gif)

to jeszcze jedno pytanie

  1. SELECT uzytkownicy.id, id_uzytkownika, id_graf, miesiac,
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = graf.id_uzytkownika
  4. AND id_graf IN (SELECT MAX( graf.id_graf) FROM graf, uzytkownicy WHERE uzytkownicy.id=graf.id_uzytkownika AND id_uzytkownika=uzytkownicy.id GROUP BY id)
  5. GROUP BY uzytkownicy.id
  6. ORDER BY nazwisko ASC


To zapytanie zwraca tylko uzytkownikow ktorzy maja najwieksze id_graf.
Musiałem je troche zedytowac i wyglada teraz tak

  1. SELECT uzytkownicy.id, id_uzytkownika, id_graf, miesiac,
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = graf.id_uzytkownika
  4. AND id_graf IN (SELECT MAX( graf.id_graf) FROM graf, uzytkownicy WHERE uzytkownicy.id=graf.id_uzytkownika AND id_uzytkownika=uzytkownicy.id AND miesiac=201109 GROUP BY id)
  5. GROUP BY uzytkownicy.id
  6. ORDER BY nazwisko ASC


I w takim przypadku zwroci mi tylko uzytkownikow, ktorzy maja wpisana jakas wartosc id_graf.
Jak zmodyfikowac zapytanie aby wyswietlic wszystkich uzytkownikow ktorzy maja max(id_graf) oraz tych ktorzy nie maja wpisanej zadnej wartosci?

Probowalem INNER JOIN'em ale nie wyswietla mi tych "pustych" uzytkownikow :/

  1. SELECT uzytkownicy.id, id_uzytkownika, id_graf, miesiac,
  2. FROM `graf` , `uzytkownicy`
  3. WHERE uzytkownicy.id = graf.id_uzytkownika
  4. OR id_graf IN (SELECT MAX( graf.id_graf) FROM graf, uzytkownicy WHERE uzytkownicy.id=graf.id_uzytkownika AND id_uzytkownika=uzytkownicy.id AND miesiac=201109)
  5. GROUP BY uzytkownicy.id
  6. ORDER BY nazwisko ASC


Wstawilem OR zamiast AND, teraz wysweitla mi wszystkich uzytkownikow z IDmax oraz pozostalych z pierwszym lepszym ID.
Także jeżeli nie wpadne na inny pomysl to zabezpiecze to przez PHP zeby sprawdzal czy aktualne ID jest MAX i w przeciwnym wypadku wyswietlal stosowne informacje.

Chyba ze mi podpowiecie jak uzyskac informacje z MySQL z wszystkimi danymi a dla uzytkownikow ktorzy nie maja w danym miesiacu MAX(id) wyswietlalo NULL lub pusta komorke?
Go to the top of the page
+Quote Post

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: 23.12.2025 - 00:14