2013-03-16 4 views
2

Я пытаюсь сортировать таблицу mysql несколькими столбцами. Вот таблица:Заказ MySql на основе нескольких столбцов

+------------+------------+------------+------------+ 
|  id  | parent_id | ordering | level | 
+------------+------------+------------+------------+ 
|  1  |  0  |  0  |  0  | 
+------------+------------+------------+------------+ 
|  2  |  0  |  2  |  0  | 
+------------+------------+------------+------------+ 
|  3  |  0  |  3  |  0  | 
+------------+------------+------------+------------+ 
|  4  |  0  |  4  |  0  | 
+------------+------------+------------+------------+ 
|  5  |  2  |  0  |  1  | 
+------------+------------+------------+------------+ 
|  6  |  0  |  1  |  0  | 
+------------+------------+------------+------------+ 

И это результат я хотел бы достичь:

+------------+------------+------------+------------+ 
|  id  | parent_id | ordering | level | 
+------------+------------+------------+------------+ 
|  1  |  0  |  0  |  0  | 
+------------+------------+------------+------------+ 
|  6  |  0  |  1  |  0  | 
+------------+------------+------------+------------+ 
|  2  |  0  |  2  |  0  | 
+------------+------------+------------+------------+ 
|  5  |  2  |  0  |  1  | 
+------------+------------+------------+------------+ 
|  3  |  0  |  3  |  0  | 
+------------+------------+------------+------------+ 
|  4  |  0  |  4  |  0  | 
+------------+------------+------------+------------+ 

Как вы можете (я надеюсь) увидеть, я хотел бы, чтобы отсортировать детали заказа и parent_id. Я бы предпочел, если возможно, использовать один запрос. Если это невозможно, я могу использовать цикл PHP в сочетании с запросом. Я хотел бы держаться подальше от нескольких запросов, если это вообще возможно.

Мне нужен способ сортировки так, чтобы строка с parent_id, такая как строка с id=5, находилась ниже ее «родительской строки» (строка с id=2). «ordering» основан на «уровне».

Ближайший я пришел это сортировкой это с:

SELECT * FROM table ORDER BY ordering,id,parent_id

который возвращает:

+------------+------------+------------+------------+ 
|  id  | parent_id | ordering | level | 
+------------+------------+------------+------------+ 
|  1  |  0  |  0  |  0  | 
+------------+------------+------------+------------+ 
|  5  |  2  |  0  |  1  | 
+------------+------------+------------+------------+ 
|  6  |  0  |  1  |  0  | 
+------------+------------+------------+------------+ 
|  2  |  0  |  2  |  0  | 
+------------+------------+------------+------------+ 
|  3  |  0  |  3  |  0  | 
+------------+------------+------------+------------+ 
|  4  |  0  |  4  |  0  | 
+------------+------------+------------+------------+ 
+5

честно, я не понимаю, как вы считаете, результат отсортирован. Ни значения в 'ordering', ни' parent_id' не находятся в отсортированном порядке. – duskwuff

+2

Можете ли вы уточнить - я не вижу, как упорядочиваются и parent_id сортируются вообще ... – sgeddes

+0

Если строки были заказаны 1, 6, 2, 3, 4, 5, то я бы понял, что вы просите. –

ответ

3

Вы пытаетесь разобраться в SUM упорядочения и столбцов PARENT_ID? Предполагая, что те были оба числовых типов данных, это должно работать:

SELECT * 
FROM YourTable 
ORDER BY Parent_Id + Ordering, Id 
+0

Wow, upvote только для обратной инженерии, что головоломка вопроса. – JohnFx

+0

@JohnFx - lmao - Это единственный «заказ», который я вижу в примере выше: D – sgeddes

+0

Это был относительно быстрый ответ из-за того, что большинство людей не понимало вопроса :) Ваш ответ действительно выглядит как будто он удовлетворяет его требованиям. –

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