Witam,
ostatnio w pracy miałem pewien problem. Mianowicie mam relację jeden do wielu (apartament posiadający wiele zdjęć), i w aplikacji potrzebuję pobrać konkretną liczbę apartamentów posortowaną po konkretnych kryteriach i dokładnie jedno zdjęcie (obojętnie które). Problem pojawia się gdy na zapytanie nałoży się limit wierszy np pierwsze 5. Jeżeli jeden apartament ma 4 zdjęcia to tak naprawdę dostane 2 apartamenty bo pierwszy wystąpi 4 razy i raz drugi i limit osiągnięty. (aplikacja korzysta z hibernate).
Rozwiązania znalazłem dwa.
-
Robie dwa zapytania, z jednego wybieram pierwsze N id apartamentu, sklejam to w aplikacji i robie drugie zapytanie, coś w stylu:
select apartamen left join images where apartemnt.id in ( lista id z pierwszego zapytania) -
Subselect w klauzuli WHERE (dla uproszczenia sam sql):
select apartment.id apart, image.id as img
FROM apartment
LEFT JOIN image ON image.apartment_id = apartment.id
WHERE image.id IN (SELECT min(id) FROM image GROUP BY apartment_id);
Oba podejścia dadzą ten sam poprawny wynik, tylko się zastanawiam jak to z wydajnością będzie. Wydaje mi się że podejście 2 ale nie wiem jak to z subselectami i funkcją agregującą.
Chyba że istnieje lepsze rozwiązanie.