Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/SQL] Zliczanie rekordów
Forum PHP.pl > Forum > PHP
LonelyKnight
Mam mały problem. Istnieje drzewo kategorii mające max. 3 poziomy (A-najwyższy, C-najniższy). Chcę zliczyć ilość rekordów w danej kategorii. Problem w tym, aby uwzględnić również rekordy ze wszystkich poziomów niższych niż wskazany. Np.

A - Śmieszne filmy
--- B - Kabarety
------ C - Ani mru mru
---------- skecz 1
---------- skecz 2
---------- skecz 3
------ C - KMN
---------- skecz 1
---------- skecz 2
--- B - ukryta kamera
------ film 1
------ film 2
------ film 3
------ film 4

Teraz jak zrobić aby optymalnie policzyć ilość filmików w kategorii Śmieszne filmy znając tylko id kategorii A?

W BD są takie informacje jak ID, ID rodzica, BOOL czy ma dzieci czy nie. Np. Śmieszne filmy ID:1, rodzic:0 (nie ma rodziców), 1. Jakoś nie widzę tego, w obecnej strukturze BD, bez rekurencji a takie rozwiązanie mnie nie zadowala...
Maciekbjw
Próbuj może w ten desen:

  1. SELECT
  2. category.category_name, category.category_permalink, category.id, (SELECT COUNT(*) FROM switch WHERE switch.id_category=category.id) AS count
  3. FROM
  4. category


Miałem kiedyś podobną strukturę, i podobnie chciałem liczyć jak Ty. Oczywiście w tym zapytaniu trzeba będzie pozmieniać trochę winksmiley.jpg

Wyślij mi zrzuty z MySQL, chętnie pomogę, wrona.maciej na gmailu.

Pozdrawiam
LonelyKnight
Podbijam. Ma ktoś pomysł? Próbowałem z czymś takim:

  1. SELECT C.id, C.parentID, count(M.id) AS moves FROM categories C LEFT JOIN moves M ON M.categoryID=C.id GROUP BY C.parentID ORDER BY C.parentID DESC';


  1. <?php
  2. while ($arrResult = mysql_fetch_assoc($resResult)) {
  3.        
  4.     if (isset($arrTmp[$arrResult['id']]))     {    
  5.         $arrTmp[$arrResult['id']]['moves'] += $arrResult['moves'];
  6.     }
  7.     else {          
  8.         $arrTmp[$arrResult['id']]['moves'] = $arrResult['moves'];
  9.         $arrTmp[$arrResult['id']]['id'] = $arrResult['id'];
  10.     }
  11.        
  12.     if (isset($arrTmp[$arrResult['parentID']])) {          
  13.         $arrTmp[$arrResult['parentID']]['moves'] += $arrResult['moves'];
  14.     }
  15.     else {          
  16.         $arrTmp[$arrResult['parentID']]['moves'] = $arrResult['moves'];
  17.        $arrTmp[$arrResult['parentID']]['id'] = $arrResult['id'];
  18.     }    
  19. }
  20. ?>


...ale nie zlicza prawidłowo i nie wiem ile jest filmów u rodzica najwyższego poziomu.

  1. CREATE TABLE IF NOT EXISTS `categories` (
  2. `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  3. `parentID` mediumint(9) NOT NULL DEFAULT '0',
  4. `title` varchar(255) NOT NULL DEFAULT '',
  5. `published` tinyint(1) NOT NULL DEFAULT '0',
  6. `child` tinyint(1) NOT NULL DEFAULT '0',
  7. `rows` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM;
  10.  
  11.  
  12. CREATE TABLE IF NOT EXISTS `moves` (
  13. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  14. `categoryID` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  15. `title` varchar(70) NOT NULL DEFAULT '',
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=MyISAM;


Może to być tak średnio optymalne bo i tak będzie odpalane cronem co jakiś czas, jednak 1000 zapytań wolałbym uniknąć ;-)
maly_swd
po najmniejszej lini oporu to:
1. robisz zapytanie ktore liczy ile jest pozycji w danej subkategorii C, oraz id kategori B i A
2. pobierasz to do tablicy w php
3. robisz petle liczaca dla kazdej id kategori B sumujaca to co jest w C
4. zapisujesz do nowej tablicy
5. robisz petle liczaca dla kazdej id kategori A sumujaca to co jest w B
6. zapisujesz do nowej tablicy

no a pozniej to juz tylko wyswietlasz (calosc zajmie 1 zapytanie)
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.