MySQL - 同组表中的组查询值

时间:2011-06-29 06:39:07

标签: mysql sql

好的,所以我有一个表,其中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 个答案:

答案 0 :(得分:1)

我认为只有一种方法可以在不使用连接的情况下进行投票....

这是如下 -

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

答案 1 :(得分:0)

我建议使用递归。查看http://www.sitepoint.com/hierarchical-data-database/有关如何执行此操作的详细信息。

如果您反对使用递归,那么您可以查看使用左值和右值来确定使用树遍历算法检索数据的位置。

如果您不想使用递归,请告诉我,我可以解释如何以其他方式执行此操作(它们更复杂,如果您只是要使用递归,我不想输入它因为输入需要大约一个小时左右的时间!!)

答案 2 :(得分:0)

根据您的示例输出的格式,您似乎只有两个级别的层次结构,即每个项目都是父项或子项。

如果是这样,你可以这样做:

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

这会将父母与子女分组,在前者之前对前者进行分类。