Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Subzapytania. Czy to zapytanie jest wydajne?
maviozo
post
Post #1





Grupa: Zarejestrowani
Postów: 197
Pomógł: 24
Dołączył: 22.11.2010

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


Przede wszystkim zacznę od tego, że mam świadomość istnienia darmowych skryptów forum (IMG:style_emoticons/default/tongue.gif) piszę sobie go w celach edukacyjnych plus zaliczenie przedmiotu (IMG:style_emoticons/default/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ć (IMG:style_emoticons/default/wink.gif) Zatem jak można zrobić to wydajniej?

Pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




rekord z tematem powinien jeszcze zawierać pole z id ostatniego posta oraz pole z liczbą postów. Wówcza unikniesz masy mulastych zapytan
Go to the top of the page
+Quote Post
maviozo
post
Post #3





Grupa: Zarejestrowani
Postów: 197
Pomógł: 24
Dołączył: 22.11.2010

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


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?
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
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: 25.08.2025 - 00:02