Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Podzapytania z użyciem MAX
Forum PHP.pl > Forum > Przedszkole
qweluke
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


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:



A tak wygląda tabela "graf":


---------------------------------------
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?
nospor
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
qweluke
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 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 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 sad.gif

Zaraz potestuję HAVING
nospor
Cytat
Aż taki głupi to nie jestem

Cytat
'maksik' to alias dla 'MAX( graf.id_graf )' ktory jest liczba tongue.gif
Mamy tu dwie sprzeczne informacje tongue.gif 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
qweluke
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)
nospor
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)
....
qweluke
z tym ze wtedy zwraca mi tylko jeden rekord dla id_uzytkownika = 1, a jeszcze jest pozostałuch 5ciu sad.gif
nospor
No tak.... coś mi się przestawiło we łbie. sad.gif
luckyps
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 wink.gif
qweluke
o! tego mi było trzeba 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 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?
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.