繁体   English   中英

MySQL - 在同一个表中分组查询值

[英]MySQL - Group Query Values in Same Table

好的,所以我有一个包含 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... 

如果我使用两张桌子会更容易吗? 我将在此表中有很多项目,因此我想使用尽可能少的查询(循环)。

任何帮助是极大的赞赏。

谢谢

我认为有一种方法可以让你在不使用 join 的情况下只做 soting....

这是如下 -

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

这将提供所需的 output...

表示父节点,然后是相应的子节点……然后是第二个父节点,依此类推……

一件事我不知道 docode function 是否也可以在我的 sql 上运行..

如果没有,那么您可以使用以下查询 -

select * from table_name order by case when ChildOf=0 then TaskID else ChildOf end,ChildOf

我建议为此使用递归。 查看http://www.sitepoint.com/hierarchical-data-database/ ,了解如何执行此操作。

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

如果您不想使用递归,请告诉我,我可以解释如何使用其他方式(它们要复杂得多,如果您只想使用递归,我不想输入它,因为它会大约需要一个小时左右才能打字!!)

根据您的样本 output 的格式,您似乎只有两个层次结构,即每个项目都是父项或子项。

如果是这样,您可以执行以下操作:

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

这会将父母与他们的孩子分组在一起,将前者排序在后者之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM