对mysql进行分组和排序(带有分层信息的数据)

时间:2017-10-21 17:23:20

标签: mysql

我有一个包含项目的表,有些是其他人的孩子(我会说很像某种论坛对话,有些是以前的孩子,有些没有孩子,有些有很多孩子,但只有一层深,没有孩子的孩子),例如我在查询一些标准后得到以下列表,按id分类:

| id  | title | date       | childof |
| 002 | tit2  | 2017-02-23 | 000     | if 000, not a child
| 003 | tit3  | 2017-05-12 | 000     | not a child
| 004 | tit4  | 2017-03-25 | 002     | child of 002
| 005 | tit5  | 2017-03-26 | 002     | other child of 002
| 006 | tit6  | 2017-06-13 | 000     | not a child
| 007 | tit7  | 2017-07-06 | 003     | only child of 003

我的问题是关于对结果进行排序/分组:我希望将结果列为以下内容:

| id  | title | date       | childof |
| 006 | tit6  | 2017-06-13 | 000     | no child most recent at first level
| 003 | tit3  | 2017-05-12 | 000     | one child
| 007 | tit7  | 2017-07-06 | 003     | only child of previous
| 002 | tit2  | 2017-02-23 | 000     | two children
| 004 | tit4  | 2017-03-25 | 002     | child #1 of 002 oldest
| 005 | tit5  | 2017-03-26 | 002     | child #2 of 002 most recent
  • 按日期(最近的第一个)为第一级(非儿童的项目)
  • 孩子们在他们的父母之后被重新组合,无论他们的日期如何,但是在父母的下面订购了最早的孩子

我的出发点是:

SELECT * FROM mytable WHERE somecriteriaok ORDER BY date GROUP BY childof。

当然我尝试了更复杂的解决方案,但似乎无法达到上述结果所以我试图提出这个问题,试图让它变得简单明了...希望我成功了,并会得到一些提示,如何去(原谅我的英文......)。

皮尔。

2 个答案:

答案 0 :(得分:0)

您是否尝试了多个订单?

ORDER BY date DESC, childof DESC

之后可能会添加GROUP BY吗?

答案 1 :(得分:0)

虽然这有点棘手,但您可以这样做,因为层次结构只有一层深度。这是一种方法,使用join

SELECT t.*
FROM mytable t LEFT JOIN
     mytable tp  -- parent
     ON tp.id = t.childof
WHERE somecriteriaok
ORDER BY COALESCE(tp.date, t.date) DESC,  -- newest parents first
         COALESCE(tp.id, t.id),           -- keep records together
         (tp.id IS NULL) DESC,            -- put the parent first
         t.date;                          -- children in date order