Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Subzapytania. Czy to zapytanie jest wydajne?
Forum PHP.pl > Forum > Przedszkole
maviozo
Przede wszystkim zacznę od tego, że mam świadomość istnienia darmowych skryptów forum tongue.gif piszę sobie go w celach edukacyjnych plus zaliczenie przedmiotu tongue.gif

Mam trzy tabele: user, forum, forum_posty.
To co nas interesuje z user, to tylko imie i nazwisko.
Tabela forum zawiera nazwy tematów, datę założenia, id, autora oraz czy temat jest widoczny.
Tabela forum_posty zawiera id posta, id tematu, autora, treść, datę i czy jest widoczny.

Problem:

Chcę wyświetlić listę tematów wg najnowszych postów, wraz z datą ostatniego i liczbą postów z tematu.
Urodziłem takie zapytanie:
  1. SELECT forum.topic_id AS id,nazwa,
  2. CONCAT(`user`.`imie`," ",`user`.`nazwisko`) AS `autor`,`forum`.`data` AS `data`,
  3. (SELECT COUNT(post_id) FROM `forum_posty`
  4. WHERE `forum_posty`.`topic_id`=`forum`.`topic_id`
  5. AND widoczny=1) AS liczba_postow,
  6. (SELECT `data` FROM `forum_posty`
  7. WHERE `forum_posty`.`topic_id`=`forum`.`topic_id` AND widoczny=1
  8. ORDER BY `post_id` DESC LIMIT 1) AS ostatni_post
  9. FROM `forum`
  10. LEFT JOIN `user` ON `user`.`user_id`=`autor`
  11. WHERE `aktywny`=1
  12. ORDER BY ostatni_post DESC

Zapytanie daje oczekiwany rezultat. Jednak trochę martwi mnie to, że są tutaj aż trzy zapytania. Oczywiście na ten projekt to nie problem, w sumie nie wiadomo, czy kiedykolwiek będę musiał przejmować się wydajnością, jednak zawsze warto takie rzeczy wiedzieć wink.gif Zatem jak można zrobić to wydajniej?

Pozdrawiam.
nospor
rekord z tematem powinien jeszcze zawierać pole z id ostatniego posta oraz pole z liczbą postów. Wówcza unikniesz masy mulastych zapytan
maviozo
No tak, to oczywiste, nawet miałem zamiar dodać właśnie po prostu liczbę postów + datę ostatniego posta w tabeli z tematami, ale za to kosztem sprawdzania wszystkiego przy dodawaniu / usuwaniu postów. (np usuwając 13 post z 10 tematu trzeba byłoby sprawdzić, czy to ostatni post, pomniejszyć liczbę postów w temacie, cofnąć datę ostatniego posta do 'przedostatniego'..)

Czy to jednak jedyne rozwiązanie?
nospor
Cytat
p usuwając 13 post z 10 tematu trzeba byłoby sprawdzić, czy to ostatni post, pomniejszyć liczbę postów w temacie, cofnąć datę ostatniego posta do 'przedostatniego'.
Ale kombinujesz... po prostu ustaw na nowo ostatni post, nawet jak ten usuwany nie jest ostatnim.

Cytat
Czy to jednak jedyne rozwiązanie?
Najoptymalniejsze.
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.