Категории с подкатегориями в таблице – PHP + MYSQL

У меня есть категории и подкатегории в моей базе данных. Таблица базы данных содержит «cid», «pid» и «cname» coloums.

Идентификатор Cid = Категории

Pid = Если Категория является Подкатегорией, то Pid =, которые принадлежат какой категории.

Cname = Название категории

Для примера Программное обеспечение – это категория и id = 15, а «Программное обеспечение IOS – это подкатегория и id = 30 и pid = 15

Теперь я хочу показать этого Кота. И Sub-Cat в таблице. Вот мой код

<?php function categories() { $categorysql = $DB['DB_Database']->query("SELECT cid, pid, cname FROM categories GROUP BY cid"); while ($row = $DB['DB_Database']->fetch_assoc($categorysql)) { if ($row['pid'] > 0 { } else { $catid = $row['cid']; $catname = $row['cname']; } } 

с этим кодом я могу показать только основные категории. Примеры фото здесь;

введите описание изображения здесь

Но я хочу показать это;

введите описание изображения здесь

Мой код таблицы выглядит следующим образом:

 <table width="268" border="1"> <tr> <td width="52" rowspan="2" valign="top">Image</td> <td width="200" height="23"><a href="{$catid}">{$catname}<a></td> </tr> <tr> <td height="36" valign="top">This ara for sub cat.</td> </tr> </table> 

Итак, как я могу это сделать, любая идея?

Я бы предложил изменить ваш PHP-код для работы со следующим sql, который использует OUTER JOIN :

 select c.cname, c2.cname subname from categories c left join categories c2 on c.cid = c2.pid where c.pid is null 
  • Демо-версия SQL Fiddle

Это предполагает, что поле pid родителя равно null. В качестве альтернативы вы можете использовать GROUP_CONCAT для возврата всех ваших подкатегорий в одну строку вместо нескольких строк – это может быть проще для вашей реализации.

Для более простой реализации вы можете сделать два запроса

Это даст все категории. (Пусть говорят, что корневая категория pid будет равна 0

SELECT name FROM categories where pid = 0

В этом цикле используйте второй запрос

 SELECT name FROM categories where pid = $catId 

Вот пример кода php для заполнения массива, который вы можете использовать

function runQuery ($ sql) {

  global $DB; $dbResource = $DB['DB_Database']->query($sql); $rows = array(); while ($row = $DB['DB_Database']->fetch_assoc($dbResource)) { $rows[] = $row; } return $rows; } function getSubCat($pid) { subCategorySql = "SELECT name FROM categories where pid = "+ $pid; return runQuery($subCategorySql); } $categorySql = "SELECT name FROM categories where pid = 0" $categories = runQuery(categorySql) $i=0; foreach($categories as $aCat) { $categories[$i++]['sub_cat'] = getSubCat($aCat['id']); } 

теперь вы можете использовать $ categories [index] ['name'] для категории и $ categories [index] ['sub_cat'] [sub_cat_index] [имя] для имени подкатегории.

Это не очень хороший подход, хотя он так часто попадает в базу данных.