【问题标题】:Select records with sub value after parent record in mysql在mysql中的父记录之后选择具有子值的记录
【发布时间】:2013-01-11 16:09:31
【问题描述】:

我的表中有这些记录:

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

我想先按父级排序我的记录,然后再按子级排序。

如何在 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

【问题讨论】:

  • 如果你用java等其他语言来做这件事会很可行
  • 顺便说一句,通常的做法是用 NULL 而不是 0 来表示孤儿(没有父节点的节点)。

标签: mysql sorting select parent-child


【解决方案1】:

如果不超过 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),它仍然会失败。

【讨论】:

  • 谢谢,您的查询对我有用,但是当我 UPDATE 记录子记录时,查询将返回错误的排序。例如,您可以将 id=5 的 sub 更新为 4
  • 我尝试了你所说的并没有得到相同的结果,请查看更新的答案。我错过了什么?
  • 抱歉,我这里没有访问权限。如果除了您在问题上发布的内容之外,您还有什么想要实现的,您应该更新它以让人们了解上下文并可能给出更完整的答案。
  • 我用您的查询结果更新了我的问题。
  • 更新了我的回答中的查询,你可以试一试吗?
【解决方案2】:

试试这个

   SELECT * ,replace(replace(title,'Parent',''),'Sub','') as nums  
   FROM Table1
    order by nums

SQLFIDDLE DEMO HERE

结果

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

编辑。

由于您的问题希望得到不同的结果。试试这个

SELECT * ,replace(title,'Item','') as nums  
FROM category
order by nums

DEMO SQLFIDDLE

Obs:确保Item与数字分开。

【讨论】:

  • 因为你之前说过Parentsub,现在你使用了Item,并确保你的Item1的第一个值应该和其他Item 1一样。
  • 谢谢,但Item 是此记录中的一个样本,如果Item 更改为另一个值,我该怎么办?
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多