|
|
|
| Добрый день
Иммется в БД таблица каталогов (подкаталогов)
CREATE TABLE IF NOT EXISTS `catalog` (
`id` int(9) NOT NULL auto_increment,
`names` text NOT NULL,
`id_p` int(9) NOT NULL
PRIMARY KEY (`id`)
) ;
--
-- Дамп данных таблицы `catalog`
--
INSERT INTO `catalog` (`id`, `names`, `id_p`) VALUES
(1, 'Андроид', '0'),
(2, 'Windows-M', '0'),
(3, 'Symbian', '0'),
(4, 'Игры', '1'),
(5, 'Программы', '2'),
(6, '240*320', '4'),
(7, '640*480', '4'),
(8, 'разные', '5');
|
и таблица файлов
CREATE TABLE IF NOT EXISTS `files` (
`id` int(9) NOT NULL auto_increment,
`names` text NOT NULL,
`id_cat` int(9) NOT NULL
PRIMARY KEY (`id`)
) ;
--
-- Дамп данных таблицы `files`
--
INSERT INTO `catalog` (`id`, `names`, `id_cat`) VALUES
(1, 'файл1', '6'),
(2, 'файл2', '6'),
(3, 'файл3', '7'),
(4, 'файл4', '7'),
(5, 'файл5', '8'),
(6, 'файл6', '8');
|
т.е в таблицу файлов (id_cat), при загрузке файлов, записывается id из таблицы каталогов
Возникает вопрос: Как мне сделать чтобы при выводе только родительских каталогов, показать кол-во файлов всех подкаталогов?
т.е выводим родительский каталог:
<?
$q= mysql_query("SELECT * FROM `catalog` WHERE `id_p`=0");
while ($arr = mysql_fetch_assoc($q))
{
echo htmlapecialchars($arr['names']);
echo "(ТУТ НАДО ВЫВЕСТИ КОЛ-ВО ВСЕХ ФАЙЛОВ ПОДКАТАЛОГОВ РОДИТЕЛЬСКОГО КАТАЛОГА)<br/>";
}
/**
Андроид (4)
Windows-M (2)
Symbian (0)
**/
?>
|
Я совсем запуталась... может я не правильно выбрала структуру таблицы файлов? | |
|
|
|
|
|
|
|
для: selma
(14.11.2011 в 07:22)
| |
$q= mysql_query("SELECT * FROM `catalog` WHERE `id_p`=COUNT(*)");
|
| |
|
|
|
|
|
|
|
для: Jovidon
(14.11.2011 в 09:38)
| | и что это даст? :) кол-во файлов должно считаться из другой таблицы | |
|
|
|
|
|
|
|
для: selma
(14.11.2011 в 09:54)
| |
<?
$q= mysql_query("SELECT * FROM `catalog`, (SELECT * FROM `files`) AS inner WHERE `id_p`=0");
while ($arr = mysql_fetch_assoc($q))
{
echo htmlapecialchars($arr['names']);
echo $arr['inner']."<br/>";
}
/**
Андроид (4)
Windows-M (2)
Symbian (0)
**/
?>
|
| |
|
|
|
|
|
|
|
для: Jovidon
(14.11.2011 в 10:22)
| | работать не будет, потому что столбец `id_p` отсутствует в таблице `files`
и еще: в таблице files не может быть id_cat=0, потому что это родительский каталог | |
|
|
|
|
|
|
|
для: selma
(14.11.2011 в 07:22)
| | Тут не обойтись без рекурсивного спуска (вернее можно, но будет еще хуже)
<?php
// Устанавливаем соединение с базой данных
require_once("config.php");
// Таблица каталогов
$tbl = "catalog";
// Извлекаем корневые каталоги
$query = "SELECT * FROM $tbl
WHERE id_p = 0";
$cat = mysql_query($query);
if(!$cat) exit("Ошибка извлечения параметров каталога");
if(mysql_num_rows($cat))
{
while($catalog = mysql_fetch_array($cat))
{
// Список подчиненных подкаталогов
$subcatalogs = get_subcatalog_list($catalog['id'], $tbl);
if(!empty($subcatalogs))
{
// Извлекаем количество файлов в подкаталоге
// и вложенных подкаталогах
$query = "SELECT COUNT(*) FROM files
WHERE id_cat IN (".implode(", ", $subcatalogs).")";
$cnt = mysql_query($query);
if(!$cnt) exit("Ошибка извлечения параметров каталога");
$total = mysql_result($cnt, 0);
}
else
{
$total = 0;
}
if($total) echo $catalog['names']." ($total)<br />";
else echo $catalog['names']."<br />";
}
}
// Возвращает список подчинённых каталогов
function get_subcatalog_list($id, $tbl)
{
// Извлекаем подчинённые каталоги
$query = "SELECT id FROM $tbl
WHERE id_p = $id";
$cat = mysql_query($query);
if(!$cat) exit("Ошибка извлечения параметров каталога");
if(mysql_num_rows($cat))
{
$arr = array();
while($catalog = mysql_fetch_array($cat))
{
$arr[] = $catalog['id'];
$new = get_subcatalog_list($catalog['id'], $tbl);
if(!empty($new)) $arr = array_merge($arr, $new);
}
return $arr;
}
else return FALSE;
}
?>
|
PS Как правило, стараются рекурсию выполнить пораньше, мы например, создаем специальную таблицу parents, где каждому каталогу сопоставляется список всех его подкаталогов. Создание такой таблицы тоже требует рекурсивного спуска, но лишь один раз, при изменении структуры каталогов. Это позволяет избавиться от медленной рекурсии на этапе формирования списка. | |
|
|
|
|