Подкатегории MySql и php - PullRequest
       47

Подкатегории MySql и php

4 голосов
/ 24 августа 2009

У меня проблемы с подкатегориями.

Я хочу отобразить это на своей странице с запросом 1 sql:

  • Категория 1:
    • Sub cat 1
    • Sub cat 2
    • ...
    • Sub cat n
  • Категория 2:
    • Sub cat 1
    • Sub cat 2
    • ...
    • Sub cat n
  • Категория 3:
    • Sub cat 1
    • Sub cat 2
    • ...
    • Sub cat n
  • ...

Схема таблицы:

  • категории
    • id | имя кота | описание
  • подкатегория
    • id | parent_id | имя кота | описание

В настоящее время я использую запрос для категорий и в PHP, в то время как цикл повторяет другой запрос для подкатегорий, но это дает мне МНОГО запросов на одной странице

Ответы [ 6 ]

1 голос
/ 24 мая 2011
 <? include('qry/viewJobs_qry.php'); ?> 
 <table width="900" class="tableFontSize">
    <TR>
        <TD>

             </a>Category
        </TD>
    </TR>
  </table>
    <?php
    if(!empty($viewJobs))    {

    while($dataJobs=mysql_fetch_array($viewJobs)) {

     $category = $dataJobs[jobNumber];

     ?>
  <script language="javascript"> 
   function toggle<? echo $category; ?>() {
   var category = "<? echo $category; ?>";
   var ele = document.getElementById(category);
   var text = document.getElementById("displayText");
 if(ele.style.display == "block") {
        ele.style.display = "none";

}
else {
    ele.style.display = "block";

}
    } 
      </script>
    <table width="900" class="tableFontSize">
    <TR>
        <TD>

            <a id="displayText" href=javascript:toggle<? echo $category; ?>();>+ </a><? echo $category; ?>  
        </TD>
    </TR>
    <TR>
        <TD>
            <span id="<? echo $jobNumber; ?>" style="display: none;"><div id="width900"><? include('subCategoryArray.php'); ?> </div></span>
        </TD>
    </TR>
            </table>

            <? }} ?>

          </table>
1 голос
/ 24 августа 2009

Вы должны получить все категории и все подкатегории. Примерно так:

$sql = '
    SELECT * FROM categories ORDER BY id ASC
';
$result = mysql_query($sql);

$categories = array();

while ($row = mysql_fetch_array($result)) {
    $categories[$row['id']] = $row;
}

// get the subcategories
$sql = '
    SELECT * FROM subcategories ORDER BY id ASC
';
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result)) {
    $categories[$row['parent_id']]['subcategories'][] = $row;
}

print_r($categories);

Это поместит их в красивую структуру массива, которую вы можете делать в PHP как угодно И это только два запроса.

1 голос
/ 24 августа 2009

Нет необходимости в двух таблицах для древовидных структур, стандартная схема древовидной таблицы может быть:

categories
id | catname | description | parent | lineage

Lineage будет содержать путь к корневой категории, например '0,2,5,6' родитель будет содержать 6

Тогда для вашего вопроса вы можете выбрать все из этой таблицы. ПОРЯДОК ПО ДЛИНЕ (lineage) ASC

после того, как у вас есть набор результатов из базы данных, вы индексируете их по их идентификатору

$categories = array();
while($row = mysql_fetch_assoc($result)){
   $categories[$row['id']] = $row;
}

теперь, когда вы просматриваете их в html, вы можете проверить, есть ли у текущей категории дочерние категории.

Lineage используется для поиска всех категорий, которые являются потомками определенной категории:

SELECT * FROM categories WHERE lineage REGEXP '[[:<:]]5[[:>:]]'

Это даст любые категории с 5 в их происхождении.

0 голосов
/ 24 августа 2009

Аналогично ответу Зеда, но выбор из подкатегории таблицы и последующее объединение категорий:

SELECT categories.name, subcategory.name
FROM subcategory
JOIN categories
  ON category.id = subcategory.category_id
ORDER BY category.id, subcategory.id

Это вернет пары значений, таких как (категория 1, подкатегория 1), (категория 1, подкатегория 2) ... Для других столбцов добавьте их в оператор и при необходимости сделайте псевдонимы, например

SELECT categories.name AS maincat_name, 
    subcategory.name AS subcat_name, subcategory.id AS subcat_id 
0 голосов
/ 24 августа 2009

Не видя таблицы, вам, вероятно, нужно что-то вроде:

SELECT category.name, subcategory.name
FROM categories
LEFT JOIN subcategory
  ON subcategory.category_id = category.id
ORDER BY category.name, subcategory.name
0 голосов
/ 24 августа 2009

Нам нужно увидеть схему вашей таблицы, чтобы предложить правильную критику, но вы могли бы объединить подкатегории с категориями в одном запросе, отсортированными по категориям и подкатегориям. Всякий раз, когда вы видите новую категорию, вы знаете, что пришло время завершить текущий список подкатегорий и начать новую категорию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...