Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zliczanie pozycji...
Forum PHP.pl > Forum > Bazy danych > MySQL
Fallout
Witam,

mam problem ze zliczeniem ilości "linków" w "kategoriach"

wyciąg z bazy:

  1. CREATE TABLE cat (
  2. cat_id Int NOT NULL AUTO_INCREMENT,
  3. cat_root Int NOT NULL,
  4. cat_name Varchar(15) NOT NULL,
  5. cat_desc Varchar(80),
  6. cat_show Bool,
  7. UNIQUE (cat_id),
  8. PRIMARY KEY (cat_id)) ENGINE = MyISAM;
  9.  
  10. CREATE TABLE links (
  11. link_id Int NOT NULL AUTO_INCREMENT,
  12. cat_id Int NOT NULL,
  13. link_date Date NOT NULL,
  14. link_title Varchar(25) NOT NULL,
  15. link_desc Varchar(100),
  16. link_www Char(60) NOT NULL,
  17. link_ok Bool NOT NULL,
  18. UNIQUE (link_www),
  19. PRIMARY KEY (link_id)) ENGINE = MyISAM;


i teraz zliczam ilosc linkow dla danej kategorii :

  1. <?php
  2.  
  3. {
  4. $sql = "SELECT Count(*) FROM links WHERE cat_id = $id";
  5. $this->db->DoSql($sql);
  6. return mysql_result($this->db->wynik,0,0);
  7. }
  8.  
  9. ?>


a taka funkcja zliczam ilosc kategorii w danej kategorii :

  1. <?php
  2.  
  3. function Count($id)
  4. {
  5.  if($id==0)
  6. $sql = "SELECT Count(*) FROM cat WHERE cat_root = 0";
  7. else
  8. $sql = "SELECT Count(*) FROM cat WHERE cat_root = $id";
  9.  
  10. $this->db->DoSql($sql);
  11. return mysql_result($this->db->wynik,0,0);
  12. }
  13.  
  14. ?>


Moje pytanie brzmi:

Jak ułożyć zapytania SQL dla zliczania wszystkich podkategorii (takze z ich podkategoriami) oraz wszystkich linkow dla danej kategorii (i ich podkategorii)
gdyz narazie udaje mi sie zliczyc tylko 1 poziom w dol...

Przyklad

- 1 (4/4)
-- 1.1 - (link1,link2)
-- 1.2
-- 1.3 (link3)
--- 1.4 (link4)

mam nadzieje ze wyrazilem sie zrozumiale smile.gif Dla pewnosci wklejam kod wyswietlajacy kategorie :

  1. <?php
  2.  
  3. function ShowCat($id)
  4. {
  5. if($id==0)
  6. $sql = "SELECT * FROM cat WHERE cat_root = 0";
  7. else
  8. $sql = "SELECT * FROM cat WHERE cat_root = $id";
  9.  
  10. $this->db->DoSql($sql);
  11. $wynik = $this->db->wynik;
  12.  
  13. while($w = mysql_fetch_array($wynik))
  14. {
  15. $cat_id = $w['cat_id'];
  16. $cat_root = $w['cat_root'];
  17. $cat_name = $w['cat_name'];
  18. $cat_desc = $w['cat_desc'];
  19.  
  20. echo $this->LinkIt($cat_id,$cat_root);
  21. echo $cat_name."</a> <b>(</b>".$this->Count($cat_id)."/".$this->CountLinks($cat_id)."<b>)</b><br>";
  22. }
  23. }
  24.  
  25. ?>



z góry Dziękuję i pozdrawiam
Marcin
SongoQ
  1. SELECT COUNT(links.cat_id) AS ilosc, cat.id
  2. FROM cat LEFT JOIN links ON (cat.id = links.cat_id)
  3. GROUP BY cat.id


To Ci poda ile jest linkow w danej kategorii (cat.id). Jesli chesz z wybranej wyciagnac to wstaw w WHERE warunek. Radze tez zmienic typ tabeli na INNODB (wymusisz relacje)
Spirit86
rekurencja, poczytaj o tym. Ja bym próbował coś w SQL zakombinować, jakąś pętlę, która, działała by dopóki istnieje rodzic kategorii, w pętli zliczało by sumę w każdej kategorii.

Coś a'la
DOPOKI(parrent>0)
sume += count(*) linki w tabeli gdzie cat = cat_id

teraz napisz to w MySQL, no i popraw błędy guitar.gif
Fallout
Cytat(SongoQ @ 2005-12-17 14:46:33)
  1. SELECT COUNT(links.cat_id) AS ilosc, cat.id
  2. FROM cat LEFT JOIN links ON (cat.id = links.cat_id)
  3. GROUP BY cat.id


To Ci poda ile jest linkow w danej kategorii (cat.id). Jesli chesz z wybranej wyciagnac to wstaw w WHERE warunek. Radze tez zmienic typ tabeli na INNODB (wymusisz relacje)

Dzięki pomogło smile.gif poprawiłem tylko kilka odwołań do cat_id i działa smile.gif

  1. SELECT COUNT(links.cat_id) AS ilosc, cat.cat_id
  2. FROM cat LEFT JOIN links ON (cat.cat_id = links.cat_id)
  3. WHERE links.cat_id = $id GROUP BY links.cat_id


teraz zostało mi pobawić się z kategoriami, ale teraz przynajmniej mam punkt odniesienia smile.gif

Nie rozumiem tylko o co chodzi z tym INNODB? Na MyISAM wszystko chodzi, w sumie nigdy nie zwracałem na to uwagi.. w jakim sensie "wymusza relację" ?

pozdrawiam
SongoQ
Cytat
Nie rozumiem tylko o co chodzi z tym INNODB? Na MyISAM wszystko chodzi, w sumie nigdy nie zwracałem na to uwagi.. w jakim sensie "wymusza relację" ?

W InnoDB masz relacje w MyISAM nie. Co to sa relacje to chyba nie musze pisac, w google pelno o tym jest. Jesli uzyjesz InnoDB i utworzysz klucz obcy wtedy mozesz przypisac co ma sie dziac jesli klucz podstawowy zostanie np usuniety. Czy ma sie pokazac blad czy usunac odwolania, czy np ustawic na NULL. Klucze obce wymuszaja pewne zachowania. Najlepiej bedzie jak sam znajdziesz info w sieci i przekonasz się do czego to sluzy.

-- Dodane
No i oczywiscie transakcje smile.gif
popbart
Co do InnoDb, to brakuje tam niestety index'ów typu fulltext, więc coś za coś.
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.