Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчет файлов во всех вложенных подкаталогах
 
 автор: selma   (14.11.2011 в 07:22)   письмо автору
 
 

Добрый день

Иммется в БД таблица каталогов (подкаталогов)

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)
**/
?>


Я совсем запуталась... может я не правильно выбрала структуру таблицы файлов?

  Ответить  
 
 автор: Jovidon   (14.11.2011 в 09:38)   письмо автору
 
   для: selma   (14.11.2011 в 07:22)
 

$q= mysql_query("SELECT * FROM `catalog` WHERE `id_p`=COUNT(*)"); 

  Ответить  
 
 автор: selma   (14.11.2011 в 09:54)   письмо автору
 
   для: Jovidon   (14.11.2011 в 09:38)
 

и что это даст? :) кол-во файлов должно считаться из другой таблицы

  Ответить  
 
 автор: Jovidon   (14.11.2011 в 10:22)   письмо автору
 
   для: 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) 
**/ 
?>

  Ответить  
 
 автор: selma   (14.11.2011 в 10:56)   письмо автору
 
   для: Jovidon   (14.11.2011 в 10:22)
 

работать не будет, потому что столбец `id_p` отсутствует в таблице `files`

и еще: в таблице files не может быть id_cat=0, потому что это родительский каталог

  Ответить  
 
 автор: cheops   (14.11.2011 в 13:42)   письмо автору
 
   для: 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($cnt0);
      }
      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, где каждому каталогу сопоставляется список всех его подкаталогов. Создание такой таблицы тоже требует рекурсивного спуска, но лишь один раз, при изменении структуры каталогов. Это позволяет избавиться от медленной рекурсии на этапе формирования списка.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования