Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL]Liczba postów i tematów danego działu, Problem z zapytaniem
Lirdoner
post 7.07.2012, 17:55:58
Post #1





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

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


Witam, piszę sobie mały skrypt forum i mam problem z pobraniem ilości tematów i postów w danym dziale.
Obecnie moje zapytanie wygląda tak: (na razie pobieram tylko liczbę tematów)
  1. SELECT f . * , COUNT(t.id) AS topics
  2. FROM `'.FORUM_TABLE.'` f
  3. LEFT JOIN '.TOPICS_TABLE.' t ON forum_id = f.id
  4. WHERE section_id = '.$row['id'].'
  5. LIMIT 0 , 30

Zapytanie to ma pobierać wszystkie działy dla danej kategorii (section_id) i wraz z nimi właśnie liczbę tematów.
Niestety przy zastosowaniu COUNT(t.id) baza zwraca mi tylko jeden rekord a działów jest kilka ;/
Co z tym zrobić?
Go to the top of the page
+Quote Post
pmir13
post 7.07.2012, 18:42:44
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Wszelkie funkcje agregujące typu count(), max(), sum() itp działają razem z GROUP BY. Jeśli tego GROUP BY nie ma, mysql uznaje że grupujemy po wszystkich rekordach. Dlatego niezbędne jest dodanie GROUP BY id_dzialu lub innej kolumny, która jednoznacznie taki dział identyfikuje. Należy jednak pamiętać, że używając GROUP BY w SELECT mogą znaleźć się tylko te kolumny, które grupujemy lub agregujemy funkcją. By uzyskać pozostałe należy ponownie dołączyć tą samę tabelę.
Go to the top of the page
+Quote Post
thek
post 7.07.2012, 20:41:33
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ja może Ci nieco rozszerzę pod kątem optymalizacji temat. W związku z tym, że częstotliwość zmian w takim skrypcie jest niska w porównaniu do odczytów, warto zdenormalizować tabelę. Zwróć uwagę, że pobieranie ilości wszystkich postów i tematów na danym forum czy ilości postów w temacie robi się makabrycznie często, nie warto tego zapytania robić non-stop. Lepiej liczby tę mieć jako dodatkowe pole statystyczne w tabeli. I tak tabela for, zawierała by pole z ilością tematów w danym forum, a tabela tematów dodatkową kolumnę z ilością postów w temacie. W ten sposób odpada Ci dodatkowy join. Możesz iść dalej i w tabeli for od razu mieć liczbę postów dla danego forum, co znów wytnie następny join. Musisz jedynie pamiętać by te liczniki podczas dodawania/usuwania/przenoszenia postów i/lub tematów modyfikować. To jest kwestia przemyślenia dla Ciebie, co da Ci lepszą wydajność i jak mocno chcesz pod tym kątem kombinować.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 16:18