Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

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

 

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

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

тема: вывод значений из под индексов в конкатенированной строке
 
 автор: Spellalex   (24.01.2011 в 17:58)   письмо автору
 
 

есть фтп, на нём файлопомойка.. она индексируется одним скриптом и результат складывается в базу (скрипт зовут chestnut-ftp-search)...
мне надо работать с базой.. искать дубликаты.. точнее не дубликаты, а только файлы с одинаковыми именами..
файлы я нахожу, теперь надо найти папки, где они лежат.. а там у файла в поле путь не сам путь, а индекс...
то есть мне выдает имя файла и кучу индексов.. по индексу можно найти имя папки, так же как и имя файла..
а как это сделать в одном запросе?
Структура базы примерно такая:
`file_entry` (
  `id` int(11) NOT NULL auto_increment,
  `name` char(50) default NULL,
  `size` int(11) default NULL,
  `directory` tinyint(4) default NULL,
  `parent_id` int(11) default NULL,
  PRIMARY KEY  (`id`)

Значения примерно такие:
mysql> select id, name, size, directory, parent_id FROM file_entry;
+----+-------+------+-----------+-----------+
| id | name  | size | directory | parent_id |
+----+-------+------+-----------+-----------+
|  1 | file  |  666 |         0 |         2 |
|  2 | papka |    0 |         1 |      NULL |
|  3 | file2 | 1024 |         0 |         2 |
|  4 | failo | 4091 |         0 |         2 |
|  5 | papko |    0 |         1 |      NULL |
|  6 | file  |  666 |         0 |         5 |          <--- дубликат, дублируется с индексом 1, а лежит в другой папке
+----+-------+------+-----------+-----------+
6 rows in set (0.01 sec)

Я делаю так:
mysql> SELECT GROUP_CONCAT(file_entry.parent_id) AS folders, name, size FROM file_entry GROUP BY file_entry.name HAVING COUNT(*) > 1;
+---------+------+------+
| folders | name | size |
+---------+------+------+
| 2,5     | file |  666 |
+---------+------+------+
1 row in set (0.01 sec)

Вот надо сделать, чтобы вместо значений "2,5" отображалось "papka,papko"...

  Ответить  
 
 автор: Trianon   (24.01.2011 в 18:13)   письмо автору
 
   для: Spellalex   (24.01.2011 в 17:58)
 

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

  Ответить  
 
 автор: Spellalex   (24.01.2011 в 18:22)   письмо автору
 
   для: Trianon   (24.01.2011 в 18:13)
 

А можно краткий пример, как прицепить таблицу алиасом?
Имена каталогов хранятся в той же таблице, что и имена файлов. Более того, они хранятся в одинаковых полях.

  Ответить  
 
 автор: Spellalex   (24.01.2011 в 18:24)   письмо автору
 
   для: Trianon   (24.01.2011 в 18:13)
 

Про многоуровневую структуру id-parent_id кажется понял.. Прискорбно, сам скрипт на питоне, который индексирует базу, может воссоздать такую структуру но для определенного file_entry.name... Как понимаю, для всех дублирующихся файлов это ресурсоёмкая операция.

  Ответить  
 
 автор: Trianon   (24.01.2011 в 18:38)   письмо автору
 
   для: Spellalex   (24.01.2011 в 18:24)
 

Можно создать таблицу каталогов, в которой построить полные пути.
Очевидно, такой запрос построения придется исполнять столько раз, сколько имеется уровней в дереве каталогов.


И, опираясь на эту таблицу, получить полные пути самих файлов.


Формально, ничто не мешает выполнить такую денормализацию с исходной таблицей.
Но файлов в ней обычно на несколько порядков больше, чем каталогов.
Поэтому неразумно.

  Ответить  
 
 автор: Trianon   (25.01.2011 в 02:58)   письмо автору
 
   для: Trianon   (24.01.2011 в 18:38)
 

to Spellalex :

Исправьте, пожалуйста, сообщение - перенесите длинную строку запроса, сейчас оно вызывает горизонтальный скроллинг .

И больше никогда так не делайте.

  Ответить  
 
 автор: Spellalex   (25.01.2011 в 02:44)   письмо автору
 
   для: Spellalex   (24.01.2011 в 17:58)
 

Вроде получилось, что хотел..
mysql> SELECT (file_entry.name) as file, (file_entry.size) as filesize, (t1.name) as folder, (t1.id) as folder_id
 FROM file_entry JOIN file_entry as t1 on file_entry.parent_id = t1.id GROUP BY file_entry.parent_id;
+------+----------+--------+-----------+
| file | filesize | folder | folder_id |
+------+----------+--------+-----------+
| file |      666 | papka  |         2 |
| file |      666 | papko  |         5 |
+------+----------+--------+-----------+
2 rows in set (0.00 sec)


А теперь вопрос такой, при исходных данных:
mysql> select id, name, size, directory, parent_id FROM file_entry; 
+----+-------+------+-----------+-----------+ 
| id | name  | size | directory | parent_id | 
+----+-------+------+-----------+-----------+ 
|  1 | file  |  666 |         0 |         2 | 
|  2 | papka |    0 |         1 |      NULL | 
|  3 | file2 | 1024 |         0 |         2 | 
|  4 | failo | 4091 |         0 |         2 | 
|  5 | papko |    0 |         1 |      2 |           <--- а вот тут у нас изменилось исходное условие...
|  6 | file  |  666 |         0 |         5 |          <--- дубликат, дублируется с индексом 1, а лежит в другой папке 
+----+-------+------+-----------+-----------+ 
6 rows in set (0.01 sec)


У директории под индексом 5, теперь появился родитель с индексом 2... Проще папка лежит в папке.
Помогите нубу, как нужно построить запрос, чтобы рекурсивно обойти все индексы, и получить полный путь, где лежит файл? Т.е. пока parent_id не станет NULL...
По итогу хотелось бы видеть табличку, что в начале этого поста, но только с полными путями... типа так:
+------+----------+--------+-----------+
| file | filesize | folder | folder_id |
+------+----------+--------+-----------+
| file |      666 | papka  |         2 |
| file |      666 | papka/papko  |         5 |
+------+----------+--------+-----------+

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

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