gpt4 book ai didi

mysql根据父id排序类别

转载 作者:IT老高 更新时间:2023-10-29 00:20:14 24 4
gpt4 key购买 nike

这是表结构

id   parent_id   name
1 0 BMW
2 0 Mercedez
3 0 Porsche
4 1 3 Series
5 2 E60
6 1 5 Series
7 3 Cayenne

如何将表格显示为

BMW
3 Series
5 Series
Mercedez
E60
Porsche
Cayenne

上表显示升序 id 后跟与该 id 关联的 parent_id,然后转到第二个 id,依此类推。我需要在一个查询中,是否可以这样做?

最佳答案

试试这个:

SELECT
name,
CASE WHEN parent_id = 0 THEN id ELSE parent_id END AS Sort
FROM
cars
ORDER BY
Sort,
id

http://sqlfiddle.com/#!2/9b05f/3


编辑:

鉴于这个答案不断获得赞成票,我重新审视了这个问题并发现了一个缺陷。如果出于某种原因,父项的 ID 高于子项,则排序会变得困惑。仅当父 ID 小于所有子 ID 时,上述查询才有效。

为了演示这个问题,假设表格看起来像这样:

id   parent_id   name
8 0 BMW
2 0 Mercedez
3 0 Porsche
4 8 3 Series
5 2 E60
6 8 5 Series
7 3 Cayenne

现在请注意,BMWid8 而不是 1。结果将如下所示:

Mercedez
E60
Porsche
Cayenne
3 Series
5 Series
BMW

请注意上面的 BMW 出现在列表的底部,它的 child 之后!这是因为二次排序是按id排序的,如果父ID恰好高于任何子ID,父ID可能不会出现在子元素之上。

这个查询将解决这个问题:

SELECT
name
FROM
cars
ORDER BY
CASE WHEN parent_id = 0 THEN id ELSE parent_id END, -- another way of writing it: IFNULL(NULLIF(parent_id, 0), id)
parent_id,
id

http://sqlfiddle.com/#!2/6d6d73/3

为了解释这里发生了什么,您首先按父行的 id 字段和子行的 parent_id 字段进行排序。如果您按此排序,所有子项将与其父级分组,并且整个列表将按父级的 id 字段排序。

但这并没有设置家族内的排序,因此父级可以出现在家族中的任何地方(父级可以出现在顶部,也可以在中间,也可以是最后一个)。

这就是其他两个排序字段的用武之地。第二个字段按parent_id排序,父行的parent_id字段始终为0 .安全地假设您的 ID 字段始终为正,这意味着父记录将始终显示在家庭中的顶部。其余 child 的 parent_id 值都相同,因此第三个排序字段按 id 字段对家庭中的 child 进行排序。这也可以更改为 name,具体取决于您希望对子项进行排序的方式。

关于mysql根据父id排序类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17147500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com