Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z group by
Forum PHP.pl > Forum > Bazy danych
wlamywacz
Witam

następujące zapytanie:
  1. mysql_query("SELECT * FROM `znajomi`, `zdjecia` WHERE (znajomi.kogo = zdjecia.user and znajomi.kto = '$user')group by kogo order by zdjecia.id DESC limit 5;") OR die(mysql_error());


powinno wracać ostatnio dodane zdjęcie każdego znajomego osoby o nazwie $user. Jednak pokazuje ono ostatnie zdjęcie czyli największe id jak wykonać to zapytanie aby zwrócił najmniejsze id z góry dziękuje.
osiris
jesli dobrze Cie zrozumialem to powinienes uzyc funkcji agregujacej:
  1. SELECT `znajomi`.*, MIN(`zdjecia`.`id`)
  2. FROM `znajomi`, `zdjecia`
  3. WHERE (znajomi.kogo = zdjecia.user AND znajomi.kto = '$user')
  4. GROUP BY kogo
  5. ORDER BY zdjecia.id DESC LIMIT 5
wlamywacz
Niestety ale przy tym zapytaniu zostaje pobrana tylko nazwa znajomego $row_2['user']
osiris
Cytat(wlamywacz @ 30.07.2007, 13:19:27 ) *
Niestety ale przy tym zapytaniu zostaje pobrana tylko nazwa znajomego $row_2['user']

Nie rozumiem. Na pewno nie zostanie zwrocona tylko nazwa znajomego bo juz w samym zapytaniu widac ze tabela znajomi ma conajmniej 2 pola + id zdjecia, to jest conajmniej 3 pola zwracane dla kazdego rekordu.

Podaj pelna strukture tabel i wklej dla przykladu wynik jednego zapytania.
wlamywacz
Przepraszam że tak długo. Oto struktura tabel wraz z przykładowymi danymi:

Znajomi:
  1. id kto kogo
  2. 3 patrycja wlamywacz



Zdjęcia:

  1. id user foto data czas tytul
  2. 95 wlamywacz 93034667 21.07.07 12:26:49 Z gogle
  3. 184 wlamywacz 61622009 29.07.07 11:37:13 :)


To zapytanie powinno pobrać wiersz o id 184 dla znajomego użytkownika patrycja o nicku wlamywacz. I tak samo z innymi znajomymi powinno pobierać jeden wiersz o najwyższym id.
osiris
Najprawdopodobniej w tabeli ze zdjeciami pole id ma atrybut autoincrement, wiec jesli chcesz pobrac ostatinio dodane zdjecie to trzeba szukac najwiekszego ID a nie najmniejszego jak sugerowales w pierwszym poscie.
Cytat
powinno wracać ostatnio dodane zdjęcie każdego znajomego osoby o nazwie $user. Jednak pokazuje ono ostatnie zdjęcie czyli największe id jak wykonać to zapytanie aby zwrócił najmniejsze id z góry dziękuje.


Podsumowujac:
Dla wybranej osoby(pole kogo) zapytanie ma zwrocic ostatnio dodane zdjecie wszystich jego znajomych(pole kto).
Dobrze zrozumialem?
Jesli tak to zapytanie powinno wygladac tak:

  1. SELECT znajomi.kto, MAX(zdjecia.id)
  2. FROM znajomi LEFT JOIN zdjecia ON zdjecia.user = znajomi.kto
  3. WHERE znajomi.kogo = '$user'
  4. GROUP BY znajomi.kto
wlamywacz
  1. SELECT znajomi.kogo, MAX(zdjecia.id)
  2. FROM znajomi LEFT JOIN zdjecia ON zdjecia.user = znajomi.kogo
  3. WHERE znajomi.kto = '$user'
  4. GROUP BY znajomi.kogo


Zapytanie działa jednak jeśli znajomy nie ma zdjęcia powstanie pewien błąd bo wyświetli znajomego ale nie pokaże fotki bo jej nie ma a to będzie źle wyglądać ;(
osiris
Cytat(wlamywacz @ 6.08.2007, 10:11:41 ) *
Jednak to nie będzie działać sad.gif Trzeba zrobić tak że pierw pobierane są zdjęcia gdyż znajomy może nie posiadać żadnych zdjęć.

Bedzie dzialac. Dla znajomych ktorzy nie maja zdjec, w polu id zdjecia bedzie po prostu NULL bo uzywasz LEFT JOIN.

Aha, czyli nie chcesz zeby pokazywal znajomych ktorzy nie maja zdjecia? Jesli tak to:
  1. SELECT znajomi.kogo, MAX(zdjecia.id)
  2. FROM znajomi, zdjecia
  3. WHERE zdjecia.user = znajomi.kogo AND znajomi.kto = '$user'
  4. GROUP BY znajomi.kogo
wlamywacz
osiris czy jest możliwość pogadania z Tobą na gg gdyż tak na forum ciężko wytłumaczyć a jest to dość skomplikowany problem.
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.