Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: LEFT JOIN i funkcja agregujaca
Forum PHP.pl > Forum > Bazy danych
osiris
Witam

Mam problem z pozornie prostym zapytaniem
Mam dwie tabele:
uzyszkodnicy
--------------
id | nazwa

zdjecia
--------
id | user_id | nr

Chce pobrac liste wszystkich uzyszkodnikow i id pierwszego zdjecia (o najmniejszym nr) jesli wogole jakies posiada (czyli left join). Doszedlem do czegos takiego:

  1. SELECT u.id, u.nazwa, z.id, MIN(z.nr)
  2. FROM users AS u
  3. LEFT JOIN zdjecia AS z ON z.user_id = u.id
  4. GROUP BY z.id


czy takie zapytanie jest optymalne?
probowalem inaczej:
  1. SELECT u.id, u.nazwa, z.id, z.nr
  2. FROM users AS u
  3. LEFT JOIN zdjecia AS z ON z.user_id = u.id
  4. GROUP BY z.id
  5. HAVING z.nr = MIN(z.nr)

Ale niestety to zapytanie nie zwraca mi uzyszkodnikow ktorzy wogole nie posiadaja zdjec.
Jakies pomysly, sugestie?

Pozdrawiam
prond
Do tego służy funkcja rank(), ale niestety nie ma jej w MySQL. Możesz to objeść przy pomocy zmiennych:
  1. SET @intRownum := 0;
  2. SET @intLastUserId := 0;
  3.  
  4. SELECT
  5. *
  6. FROM users u LEFT OUTER
  7. (
  8. SELECT
  9. user_id,
  10. id AS photo_id
  11. CASE WHEN @intLastUserId <> user_id THEN @intRownum := 1
  12. ELSE @intRownum := @intRownum + 1 END AS rank,
  13. @intLastUserId := user_id
  14. FROM zdjecia ORDER BY id ASC ) AS p
  15. ON (u.id = p.user_id)
  16. WHERE p.rank = 1 OR p.rank IS NULL;
akubiczek
Cytat(osiris @ 19.07.2007, 15:42:44 ) *
  1. SELECT u.id, u.nazwa, z.id, z.nr
  2. FROM users AS u
  3. LEFT JOIN zdjecia AS z ON z.user_id = u.id
  4. GROUP BY z.id
  5. HAVING z.nr = MIN(z.nr)

Ale niestety to zapytanie nie zwraca mi uzyszkodnikow ktorzy wogole nie posiadaja zdjec.
Jakies pomysly, sugestie?


Dodaj OR z.nr IS NULL
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.