MySQL - значения групповых запросов в одной таблице - PullRequest
1 голос
/ 29 июня 2011

Хорошо, у меня есть таблица с TaskID и ChildOf в качестве полей ... так что ...

TaskID уникален и имеет автоинкремент

If ChildOf == 0, then it has no Parent (top tier)...

If ChildOf != 0, then it is assigned TaskId of its Parent

Вопрос: Как сформироватьзапрос для получения результатов, подобных этому ...

Parent Task
 Child Task
 Child Task

Parent Task
 Child Task

Etc.. etc... 

Было бы проще, если бы я использовал две таблицы?В этой таблице будет много элементов, поэтому я хочу использовать как можно меньше запросов (циклов).

Любая помощь очень ценится.

Спасибо

Ответы [ 3 ]

1 голос
/ 03 июля 2011

Я думаю, что есть один способ, с помощью которого вы должны делать soting без использования join ....

это как следует -

select * from table_name order by decode(ChildOf,0,TaskID,ChildOf),ChildOf

это даст желаемый результат ...

означает родительский узел, а затем соответствующий дочерний узел ... а затем второй родительский узел и т. д.

одна вещь, я не знаю, работает ли функция docode на моем sql или нет ..

если нет, то вы можете использовать следующий запрос -

select * from table_name order by case when ChildOf=0 then TaskID else ChildOf end,ChildOf
0 голосов
/ 03 июля 2011

Исходя из того, как отформатирован ваш пример вывода, кажется, что у вас есть только два уровня иерархии, т.е. каждый элемент является либо родителем, либо дочерним.this:

SELECT t.*
FROM atable t
  LEFT JOIN atable p ON t.ChildOf = p.TaskId
ORDER BY
  COALESCE(p.TaskId, t.TaskId),
  CASE WHEN p.TaskId IS NOT NULL THEN t.TaskId ELSE 0 END

Это сгруппирует родителей вместе с их детьми, сортируя первые по последним.

0 голосов
/ 03 июля 2011

Я бы порекомендовал использовать для этого рекурсию.Проверьте http://www.sitepoint.com/hierarchical-data-database/, чтобы узнать, как это сделать.

Если вы против использования рекурсии, то вы можете использовать левое и правое значения, чтобы определить, где и использоватьалгоритм обхода дерева для получения ваших данных.

Просто дайте мне знать, если вы не хотите использовать рекурсию, и я могу объяснить, как это сделать другими способами (они намного сложнее, и я не хотел печатать это, если вы просто собираетесьиспользовать рекурсию, потому что это займет около часа или около того, чтобы напечатать !!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...