Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skomplikowane zapytanie MySQL
Forum PHP.pl > Forum > PHP
armata12
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
bim2
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]).')';
armata12
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).") ";
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.