Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP/SQL] Zliczanie rekordów
LonelyKnight
post 28.03.2009, 14:32:57
Post #1





Grupa: Zarejestrowani
Postów: 240
Pomógł: 13
Dołączył: 1.06.2007
Skąd: Wrocław

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


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...

Ten post edytował LonelyKnight 28.03.2009, 16:45:09


--------------------
Good programming is 99% sweat and 1% coffee.
Make it idiot proof and someone will make a better idiot...
Go to the top of the page
+Quote Post
Maciekbjw
post 28.03.2009, 23:01:19
Post #2





Grupa: Zarejestrowani
Postów: 217
Pomógł: 23
Dołączył: 2.12.2007
Skąd: Warszawa

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


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


--------------------
Masz swoje mieszkanie i chcesz je wynająć? Sprawdź ofertę Zarzadządzanie Najmem

WRONA.IT - pozycjonowanie stron
www.ecyklopedia.pl
Go to the top of the page
+Quote Post
LonelyKnight
post 22.05.2009, 12:01:07
Post #3





Grupa: Zarejestrowani
Postów: 240
Pomógł: 13
Dołączył: 1.06.2007
Skąd: Wrocław

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


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ąć ;-)

Ten post edytował LonelyKnight 22.05.2009, 12:02:44


--------------------
Good programming is 99% sweat and 1% coffee.
Make it idiot proof and someone will make a better idiot...
Go to the top of the page
+Quote Post
maly_swd
post 22.05.2009, 16:04:42
Post #4





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


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)


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
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: 4.07.2025 - 20:29