Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Podzapytania z użyciem MAX, dlaczego operator "=" nie działa?
qweluke
post 20.09.2011, 09:34:25
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


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?

Ten post edytował qweluke 20.09.2011, 12:44:14
Go to the top of the page
+Quote Post
nospor
post 20.09.2011, 09:38:26
Post #2





Grupa: Moderatorzy
Postów: 36 557
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


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

"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
qweluke
post 20.09.2011, 09:46:51
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 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

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





Grupa: Moderatorzy
Postów: 36 557
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 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


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

"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
qweluke
post 20.09.2011, 12:08:15
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 20.09.2011, 12:10:37
Post #6





Grupa: Moderatorzy
Postów: 36 557
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)
....


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

"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
qweluke
post 20.09.2011, 12:12:09
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 sad.gif
Go to the top of the page
+Quote Post
nospor
post 20.09.2011, 12:17:46
Post #8





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




No tak.... coś mi się przestawiło we łbie. sad.gif
Powód edycji: [nospor]:


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

"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
luckyps
post 20.09.2011, 12:19:49
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 wink.gif
Go to the top of the page
+Quote Post
qweluke
post 21.09.2011, 12:50:16
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 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?
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: 24.06.2025 - 05:45