|
|
|
| есть фтп, на нём файлопомойка.. она индексируется одним скриптом и результат складывается в базу (скрипт зовут 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"... | |
|
|
|
|
|
|
|
для: Spellalex
(24.01.2011 в 17:58)
| | Отобразить локальные имена каталогов несложно.
Нужно лишь прицепить алиасом таблицу еще раз.
Отобразить же полные пути, учитывая многоуровневую структуру id-parent_id уже не выйдет. | |
|
|
|
|
|
|
|
для: Trianon
(24.01.2011 в 18:13)
| | А можно краткий пример, как прицепить таблицу алиасом?
Имена каталогов хранятся в той же таблице, что и имена файлов. Более того, они хранятся в одинаковых полях. | |
|
|
|
|
|
|
|
для: Trianon
(24.01.2011 в 18:13)
| | Про многоуровневую структуру id-parent_id кажется понял.. Прискорбно, сам скрипт на питоне, который индексирует базу, может воссоздать такую структуру но для определенного file_entry.name... Как понимаю, для всех дублирующихся файлов это ресурсоёмкая операция. | |
|
|
|
|
|
|
|
для: Spellalex
(24.01.2011 в 18:24)
| | Можно создать таблицу каталогов, в которой построить полные пути.
Очевидно, такой запрос построения придется исполнять столько раз, сколько имеется уровней в дереве каталогов.
И, опираясь на эту таблицу, получить полные пути самих файлов.
Формально, ничто не мешает выполнить такую денормализацию с исходной таблицей.
Но файлов в ней обычно на несколько порядков больше, чем каталогов.
Поэтому неразумно. | |
|
|
|
|
|
|
|
для: Trianon
(24.01.2011 в 18:38)
| | to Spellalex :
Исправьте, пожалуйста, сообщение - перенесите длинную строку запроса, сейчас оно вызывает горизонтальный скроллинг .
И больше никогда так не делайте. | |
|
|
|
|
|
|
|
для: 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 |
+------+----------+--------+-----------+
|
| |
|
|
|