Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zliczanie pozycji..., jak to ugryzść?
Fallout
post 17.12.2005, 01:37:43
Post #1





Grupa: Zarejestrowani
Postów: 154
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Olsztyn

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


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


--------------------
Go to the top of the page
+Quote Post
SongoQ
post 17.12.2005, 14:46:33
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


  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)


--------------------
Go to the top of the page
+Quote Post
Spirit86
post 17.12.2005, 15:00:27
Post #3





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

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


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


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
Fallout
post 17.12.2005, 15:28:32
Post #4





Grupa: Zarejestrowani
Postów: 154
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Olsztyn

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


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


--------------------
Go to the top of the page
+Quote Post
SongoQ
post 17.12.2005, 15:42:27
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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


--------------------
Go to the top of the page
+Quote Post
popbart
post 17.12.2005, 16:26:07
Post #6





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

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


Co do InnoDb, to brakuje tam niestety index'ów typu fulltext, więc coś za coś.


--------------------
Visual Basic - kto by pomyślał :)
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: 12.06.2025 - 21:14