Chcę wyświetlać od 20 do maksymalnie 100 obiektów na stronie. Sprawdzę jeszcze wydajność rozwiązania zaproponowanego przez @theka, bo widzę, że to rzeczywiście głównie rodzaj złączenia decyduje o drastycznym spadku wydajności. A jeśli to mnie nie usatysfakcjonuje to chyba podzielę sobie całość na 2 lub nawet 3 zapytania. Gdzieś po prostu wyczytałem jakąś mądrość, że "jeśli da się coś zrobić jednym zapytaniem to tak jest najlepiej" i stąd moje pierwotne pytanie.
SELECT
t_obiekty.id,
COUNT(t_komentarze.id) AS liczba_komentarzy,
(SELECT COUNT(t_oceny.id) FROM t_oceny WHERE t_oceny.id_obiektu=t_obiekty.id) AS liczba_ocen,
(SELECT AVG(t_oceny.ocena) FROM t_oceny WHERE t_oceny.id_obiektu=t_obiekty.id) AS srednia_ocena
FROM t_komentarze
INNER JOIN t_obiekty ON t_komentarze.id_obiektu = t_obiekty.id
GROUP BY t_obiekty.id
wykonuje się w 0,05 sekundy (60-krotny wzrost wydajności w porównaniu ze zmodyfikowanym rozwiązaniem @singollo). Muszę się tylko zastanowić co zrobić z faktem, że obiekty bez ani jednego komentarza nie są wyświetlane. Jest ich, co prawda mało (około 1%) ale chciałbym je też wyświetlać.
Kurcze, tylko jak wybrać obiekty bez komentarzy?
Nic lepszego niż
SELECT t_obiekty.id FROM t_obiekty WHERE t_obiekty.id NOT IN (SELECT t_komentarze.id_obiektu FROM t_komentarze)
nie udało mi się wymyślić. A wykonuje się to przez 1,75 sekundy. To zdecydowanie za długo!
Da się jakoś inaczej? Może jakiś sprytny UNION albo coś? Właściwie potrzebne mi są tylko id obiektów bez komentarzy. W ich przypadku nie muszę mieć żadnych innych danych.