SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.01.2011 01:28:01

Spellalex
Участник
Зарегистрирован: 25.01.2011
Сообщений: 6

вывод значений из под индексов в конкатенированной строке

есть фтп, на нём файлопомойка.. она индексируется одним скриптом и результат складывается в базу (скрипт зовут 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"...

Неактивен

 

#2 25.01.2011 02:43:25

Spellalex
Участник
Зарегистрирован: 25.01.2011
Сообщений: 6

Re: вывод значений из под индексов в конкатенированной строке

Вроде получилось, что хотел..

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 |
+------+----------+--------+-----------+
 

Неактивен

 

#3 25.01.2011 11:36:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: вывод значений из под индексов в конкатенированной строке

Объединение нашли — это хорошо. А вот дерево обойти одним запросом не
удастся. Или делайте несколько запросов, или поддерживайте какую-то
денормализацию. Удобная в данном случае — табличка «все родители» с
двумя столбцами «элемент» и «родитель», но в отличие от существующей у
Вас таблички — туда добавляются не только непосредственные родители, но
и «дедушки», «прадедушки», и т.п. Тогда объединение с этой табличкой
позволит выбрать все нужные элементы.

Неактивен

 

#4 25.01.2011 14:30:42

Spellalex
Участник
Зарегистрирован: 25.01.2011
Сообщений: 6

Re: вывод значений из под индексов в конкатенированной строке

Спасибо за ответ!
Проблему решил другим путем, всё дерево обходить оказалось очень ресурсоёмкой задачей, да в принципе и не нужной.
Запрос фактически остался таким же как в посте #2.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson