2016-04-21 3 views
1

У меня есть таблица, как этотMySql: запись заказ по идентификатору и родителей

CREATE TABLE `Table1` (
`id` INT NOT NULL AUTO_INCREMENT, 
`parent` INT NOT NULL, 
`comment` TEXT, 
PRIMARY KEY(`id`) 
); 

Который имеет следующие примеры данных (с некоторым пользователем генерируемый текст в поле комментария)

+------+---------+- 
| id | parent | 
+------+---------+ 
| 1 | 0 | 
| 2 | 1 | 
| 3 | 0 | 
| 4 | 1 | 
| 5 | 0 | 
| 6 | 5 | 
| 7 | 4 | 
+------+---------+ 

Как я могу получить следующий порядок в инструкции SELECT.

+------+---------+- 
| id | parent | 
+------+---------+ 
| 1 | 0 | 
| 2 | 1 | 
| 4 | 1 | 
| 7 | 4 | 
| 3 | 0 | 
| 5 | 0 | 
| 6 | 5 | 
+------+---------+ 

Я хочу перечислить запись после того, как его родительской записи, а строки с родителем 0 должны быть отсортированы по признаку их «ид».

+0

Не ясно, не могли бы вы объяснить немного больше о сортировочной логики вы är e после? –

+1

Вы уверены, что не хотите, чтобы строки с родителем 0 сверху, а затем отсортированы по id, как и остальные ваши строки? Я не вижу, как этот порядок может быть полезен. Если вы применяете другое правило сортировки в зависимости от значения ... то оно действительно не сортируется. –

+1

MySQL не предназначен для выполнения подобных действий, лучше сделать это после того, как вы извлекли данные, перейдя через массив. – Jester

ответ

1

Так что, если я правильно понимаю, ваши комментарии структурированы как дерево (корень равен 0, другие все имеют родительский элемент и в конечном итоге связаны с 0). Я не знаю, какую технологию sql вы используете, но Oracle предоставляет способ отображения элементов дерева по порядку.

Посмотрите на «начать с» и «подключаться с», например, здесь: http://www.adp-gmbh.ch/ora/sql/connect_by.html

Я думаю, что это может помочь вам добиться того, что вы хотите сделать

Что-то вроде (не проверено на всех, только намек)

select * from Table1 start with 0 connect by parent 

EDIT

Sin ce Фактически вы используете MySQL, вышеупомянутое решение невозможно (спасибо @MJV для заметок). Вот идея решения. Предполагается, что при добавлении нового комментария вы можете добавить дополнительную информацию в свою таблицу. Он также предполагает, что новый комментарий будет иметь более высокий идентификатор, чем его родители (для сортировки легко. Ваш пример, похоже, предполагает одно и то же)

Вы можете добавить root_parent (старший родитель) для каждого комментария в вашей таблице:

+------+---------+-------------+ 
| id | parent | root_parent |    Corresponding trees 
+------+---------+-------------+ 
| 1 | 0 |  1  |   1   3   5 
| 2 | 1 |  1  |  /\    /
| 3 | 0 |  3  |  / \    / 
| 4 | 1 |  1  |  2  4    6 
| 5 | 0 |  5  |   /
| 6 | 5 |  5  |  /
| 7 | 4 |  1  |   7 
+------+---------+ ------------+ 

Теперь вы можете получить свой заказ по телефону

select * from table1 order by root_parent, id 

Позвольте мне знать, если он работал

+0

И вы можете посмотреть здесь эквивалент, если вы не используете oracle: http://stackoverflow.com/questions/2200636/oracle-connect-by-clause-equivalent-in-sql-server –

+0

Я думаю, что MySQL (о котором шла речь) не поддерживает каких-либо рекурсивных запросов. Подробнее здесь: http://stackoverflow.com/questions/7631048/connect-by-prior-equivalent-for-mysql – MJV

Смежные вопросы