mysql - 在mysql中选择父记录之后具有子值的记录

标签 mysql sorting select parent-child

我的表中有这些记录:

id   |   title     |  sub
-----+-------------+------
1    | Parent 1    | 0
2    | Parent 2    | 0
3    | Sub 1-1     | 1
4    | Parent 3    | 0
5    | Sub 1-2     | 1
6    | Sub 2-1     | 2
7    | Parent 4    | 0

现在我想用这样的一个查询从我的表中选择这条记录:

id   |   title     |  sub
-----+-------------+------
1    | Parent 1    | 0
3    | Sub 1-1     | 1
5    | Sub 1-2     | 1
2    | Parent 2    | 0
6    | Sub 2-1     | 2
4    | Parent 3    | 0
7    | Parent 4    | 0

我想先按 parent 对我的记录进行排序,然后再按 child 排序。

我如何在 mySQL 中执行此操作?

更新:

我使用这个查询:

SELECT a.*, 
       CASE WHEN SUB = 0 THEN ID ELSE SUB END expression
  FROM category a
 ORDER BY CASE WHEN SUB = 0 THEN ID ELSE SUB END, ID

我的数据是:

id  | title     | sub 
----+---------------+-------
1   | Parent 1  | 0
2   | Parent 2  | 0
3   | Sub 1-1   | 7
4   | Parent 3  | 0
5   | Sub 1-2   | 4
6   | Sub 2-1   | 2
7   | Parent 4  | 0

结果是:

id  | title     | sub   | expression
----+-----------+-------+-----------
1   | Parent 1  | 0     | 1
2   | Parent 2  | 0     | 2
6   | Sub 2-1   | 2     | 2
4   | Parent 3  | 0     | 4
5   | Sub 1-2   | 4     | 4
3   | Sub 1-1   | 7     | 7
7   | Parent 4  | 0     | 7

最佳答案

如果不超过 1 级,您可以在 order by 子句中使用 CASE 进行表达式:

SELECT a.*, 
       CASE WHEN SUB = 0 THEN ID ELSE SUB END expression
  FROM test a
 ORDER BY CASE WHEN SUB = 0 THEN ID ELSE SUB END, SUB, TITLE

使用该表达式,它将始终按 parentId 排序,填充时为 SUB 列,如果不是子项,则为 ID 列。

结果:

ID  TITLE        SUB   EXPRESSION
1   Parent 1       0          1
3   Sub 1-1        1          1
5   Sub 1-2        1          1
2   Parent 2       0          2
6   Sub 2-1        2          2
4   Parent 3       0          4
7   Parent 4       0          7

如果任何子项可能是另一条记录的父项(例如 Sub 1-2-1),它仍然会失败。

关于mysql - 在mysql中选择父记录之后具有子值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14560032/

相关文章:

sorting - 在vue.js中对两个方向进行排序

sorting - Elasticsearch-按输入顺序排序

PHP 从选择中返回 id

mysql - 我可以强制MySQL在查询完成之前输出结果吗?

php - Slim Framework API - 如何为多个 .php 的存储 API 配置 .htaccess 文件

php - 使用 PHP 在不同页面中发布变量以创建动态表

mysql - Concat (SQL) 的 NetSuite 字段公式问题

algorithm - 为什么基数排序是 O(nd) 而归并排序不是 O(d*nlogn)?

xml - XSLT 为什么这个非常基本的选择不起作用?

php - 修改 View 而不删除基础表