Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> LEFT JOIN i funkcja agregujaca
osiris
post
Post #1





Grupa: Zarejestrowani
Postów: 121
Pomógł: 15
Dołączył: 19.07.2007

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


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
Go to the top of the page
+Quote Post
prond
post
Post #2





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

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


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;
Go to the top of the page
+Quote Post
akubiczek
post
Post #3





Grupa: Zarejestrowani
Postów: 189
Pomógł: 0
Dołączył: 4.07.2004
Skąd: z neostrady

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


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
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.08.2025 - 06:34