【问题标题】:MySQL Sorting by parents and childrenMySQL 按父母和孩子排序
【发布时间】:2018-09-03 17:16:39
【问题描述】:

这里是一个简单的表格:

id, title, parent, ordering
---------------------------
3242, TitleB, 0, 1
6574, TitleBA, 3242, 1
2346, TitleBB, 3242, 2
2344, TitleA, 0, 1
7346, TitleAC, 2344, 3
3574, TitleAB, 2344, 2
2256, TitleAA, 2344, 1
1435, TitleC, 0, 1
4354, TitleCA, 1435, 1

我正在搜索一个可以像这样排序和输出这些行的查询:

TitleA
  TitleAA
  TitleAB
  TitleAC
TitleB
  TitleBA
  TitleBB
TitleC
  TitleCA

因此,行应该由第一个父项排序,然后是其子项排序。然后是下一个父项,然后是其子项,依此类推。

父母自己的顺序无所谓!标题仅用于更好理解,不能用于排序。重要的是孩子们在他们的父母之下被排序。

这是我做的最后一个查询:

SELECT *
FROM table t1
     LEFT JOIN table t2
     ON t2.id = t1.parent 
ORDER BY COALESCE(t1.ordering, t2.ordering), t2.ordering   

【问题讨论】:

  • 你至少给我们看看你的桌子怎么样?
  • 你看到上面的表格了吧?
  • 如果是这种情况,简单的“ORDER BY title”就可以了。
  • 标题是我选择的,以便更好地理解这个例子。当然,您不能在现实生活中按字母顺序排序。这应该很清楚。
  • 我们是否应该假设您还选择了什么?你怎么知道 TitleA 应该在 TitleB 前面?

标签: mysql sorting


【解决方案1】:

部分解决方案可能是以下查询:

SELECT t.title FROM t GROUP BY IF(parent=0,id,parent), 
IF(parent=0,-1,ordering), t.title ORDER BY IF([parent]=0,
id,parent), IF(parent=0,-1,ordering);

结果如下:

TitleC
TitleCC
TitleA
TitleAA
TitleAB
TitleAC
TitleB
TitleBA
TitleBB

要缩进每个组的标题,可以使用 MS Access 中的报告之类的东西。 我是在 MS Access 中准备的,所以 MySQL 的语法可能会略有不同。

【讨论】:

  • 谢谢,但选择标题只是为了更好地理解示例。它们可以完全不同,不能用于排序。
  • 没有标题,我们怎么知道谁是谁的父母和孩子? TitleATitleBTitleC 具有相同的 parent 值 =0,以及相同的 ordering=1。
  • 查看 id 和父列。
  • 父母的顺序无关紧要。重要的是孩子们在他们的父母之下被排序。
  • id 一些关于父子关系的信息吗?
【解决方案2】:
SELECT *, if(parent = 0, id, parent) as main_order
FROM `tbl`
ORDER by main_order, ordering, parent

我认为此查询适用于 1 - parent child。

解决同样的问题看这里: order sql tree hierarchy

【讨论】:

  • 看起来很有趣,但顺序错误。 ID 不应作为搜索条件。
  • 并非如此。嵌套树集用于无限的层次结构,我无法创建函数。
  • 这个解决方案在插入和更新时工作缓慢但在选择时工作得很快
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2016-07-25
相关资源
最近更新 更多