MySQL根据父ID排序类别(mysql sort category according to parent id)
2021/9/17 19:08:50
本文主要是介绍MySQL根据父ID排序类别(mysql sort category according to parent id),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
这是表结构
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的编号时,以上查询才有效.
为演示该问题,请想象表看起来像这样:
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
现在请注意,BMW的id为 8 ,而不是 1 .结果将如下所示:
Mercedez E60 Porsche Cayenne 3 Series 5 Series BMW
请注意, BMW 显示在列表的底部,之后其子项!这是因为id的二级排序顺序,并且如果父ID碰巧高于任何子代,则父代可能不会出现在子代之上.
此查询将解决该问题:
SELECT name FROM cars ORDER BY CASE WHEN parent_id = 0 THEN id ELSE parent_id END, -- another way of writing it: ISNULL(NULLIF(parent_id, 0), id) parent_id, id
http://sqlfiddle.com/#!2/6d6d73/3
要解释这里发生的情况,请先按父行的id字段和子行的parent_id字段排序.如果按此顺序进行排序,则所有子项都将与其父项归为一组,并且整个列表将由父项的id字段进行排序.
但是,这并没有设置家庭内部的排序,因此父母可以出现在家庭内部的任何位置(父母可以出现在顶部,或者可以出现在中间,或者可以是最后).
这是其他两个排序字段的输入位置.第二个字段按parent_id排序,父行的parent_id字段始终为0.安全地假设您的ID字段始终为正,这意味着父记录将始终显示在家族的顶部.其余子项的parent_id值均相同,因此第三个排序字段通过id字段对家庭中的子项进行排序.也可以将其更改为name,具体取决于您希望孩子如何排序.
This is the table structure
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
How can i show the table as
BMW 3 Series 5 Series Mercedez E60 Porsche Cayenne
The above table shows ascending id followed by parent_id associated with that id, then go to second id and so on. I need in a single query, is it possible to do as such?
解决方案Try this:
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
EDIT:
Given that this answer keeps getting upvotes, I revisited the question and found a flaw. If, for some reason, the parent has a higher ID than the child, the ordering gets messed up. The above query only works if the parent ID is a lower number than all the children.
To demonstrate the problem, imagine the table looked like this:
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
Notice now that BMW has an id of 8 instead of 1. The result will look like this:
Mercedez E60 Porsche Cayenne 3 Series 5 Series BMW
Notice above that BMW shows up at the bottom of the list, after its children! This is because the secondary sorting orders by id, and if the parent ID happens to be higher than any children, the parent may not show up on top of the children.
This query will solve that problem:
SELECT name FROM cars ORDER BY CASE WHEN parent_id = 0 THEN id ELSE parent_id END, -- another way of writing it: ISNULL(NULLIF(parent_id, 0), id) parent_id, id
这篇关于MySQL根据父ID排序类别(mysql sort category according to parent id)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南