Subselect vs 2 zapytania.

0

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.

  1. 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)

  2. 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.

0

najlepsze rozwiązanie, które znam, to przetestuj proponowane przez ciebie rozwiązania - przecież masz dostęp do tej bazki. Przecież to tylko polecenie select ... - nic nie zmieniasz w bazie.
Możesz oczywiście pokusić się o tabele tymczasowe, potem ich filtrowanie, ale to zajmuje czas.
Trzymając się jednak wątku muszę nadmienić, że dobra praktyka programowania polega znalezieniu kompromisu pomiędzy różnymi czynnikami - złotego środka na razie nie znaleziono javascript:append_smile(':-/')

0

można jeszcze tak:

select apartment.id apart, min(image.id) as img
FROM apartment
LEFT JOIN image ON image.apartment_id = apartment.id
GROUP BY apartment.id

ale nie wiem czy będzie wydajniejsze.
Albo po prostu dodać w tabeli ze zdjeciami pole boolowskie w którym oznaczające które zdjęcie jest główne

1 użytkowników online, w tym zalogowanych: 0, gości: 1