Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Skomplikowane zapytanie MySQL, Wyświetlanie tekstów z kilku poziomów podkategorii
armata12
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 18.12.2004

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


Witam, robię serwis z poradami.
Mam 4 poziomy kategorii i potrzebuje aby po kliknięciu w kategorię nr 1(najwyższego rzędu) wyświetliły mi się porady z wszystkich podkategorii włącznie z poziomem 4. Wspomnę, iż porady mogą być zapisywane w kategoriach rzędu 2,3 i 4. Przy czym czasami są tylko 2 poziomy.

Tabela kategorii:
id|cat_id|title

Tabela porad:
id|cat_id|user_id|title|.......

  1. SELECT DISTINCT a.id, a.user_id, a.photo, a.title, a.date, a.views, u.username
  2. FROM `advices` AS a, `users` AS u , `categories` AS c1, `categories` AS c2, `categories` AS c3
  3. WHERE ((c1.`cat_id`='$cat' AND c1.`id`=a.`cat_id`) OR
  4. (c1.`cat_id`='$cat' AND c1.`id`=c2.`cat_id` AND c2.`id`=a.`cat_id`) OR
  5. (c1.`cat_id`='$cat' AND c1.`id`=c2.`cat_id` AND c2.`id`=c3.`cat_id` AND c3.`id`=a.`cat_id`)) AND a.`user_id`=u.`id`


Powyższe zapytanie długo się wykonuje i pewnie im więcej będzie porad będzie co raz gorzej.
Proszę o pomoc z zoptymalizowaniu zapytania.

Będę wdzięczny za pomoc. Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
bim2
post
Post #2





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Pobierz sobie wszystkie kategorie od razu SELECT * FROM categories, i później stwórz z tego tablicę na zasadzie
  1. array('[id najwyzszej kategorii]' => array('id najwyzszej kategorii','podkategoria','podkategoria1'), 'podkategoria' => array('podkategoria','podkategoria1')...)

Wtedy odwołasz się
  1. $sql = 'SELECT * FROM advices WHERE cat_id IN ('.implode(',', $array[$cat]).')';


Ten post edytował bim2 26.09.2009, 17:34:58
Go to the top of the page
+Quote Post
armata12
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 18.12.2004

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


Dzięki bardzo, pomogłeś mi. Zrobiłem to ciut inaczej ale też na tablicach. W strukturalnym mniej więcej tak:

  1. $cat_id = intval($_GET['cat']);
  2. $cats = array($cat_id);
  3.  
  4. $number_subcats = count($subcats[$cat_id]);
  5. for($i = 0; $i < $number_subcats; $i++)
  6. {
  7. $cats[] = $subcats[$cat_id][$i]['id'];
  8.  
  9. $cat_id2 = $subcats[$cat_id][$i]['id'];
  10. $number_subcats2 = count($subcats[$cat_id2]);
  11. for($i2 = 0; $i2 < $number_subcats2; $i2++)
  12. {
  13. $cats[] = $subcats[$cat_id2][$i2]['id'];
  14. }
  15. }
  16. $cat = " WHERE a.`cat_id` IN (".implode(',', $cats).") ";
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 3.10.2025 - 22:58