我有一个表,其中SUBROW
显示行的ID(如果不是0),并指示该行是否是另一行的子行。
ID | SUBROW
1 | 0
2 | 0
3 | 1
4 | 2
5 | 1
我需要一个查询,它将按以下顺序选择:
ID | SUBROW
1 | 0
3 | 1
5 | 1
2 | 0
4 | 2
想法?
答案 0 :(得分:1)
假设父母的id始终小于孩子,你可以使用类似ORDER BY LEAST(ID, SUBROW), ID
之类的东西,先由父母的顺序,然后是孩子的。
...实际上,假设只有两个“层”(父母和孩子,没有孙子),父ID不需要小于孩子
ORDER BY IF(SUBROW = 0, ID, SUBROW), SUBROW <> 0, ID
或
ORDER BY CASE WHEN SUBROW = 0 THEN ID ELSE SUBROW END, SUBROW <> 0, ID
这首先按父ID(如果有的话)排序,然后该行是否有父,然后最后, ID
只有在你想保证孩子的顺序不能改变时才需要从一次执行查询到下一次。
答案 1 :(得分:0)
SELECT tmp.Id,
tmp.SUBROW FROM (
SELECT d.Id,
d.SUBROW,
CASE WHEN d.SUBROW=0 THEN CAST(d.Id AS VARCHAR)+'00'
ELSE
CAST(d.SUBROW AS VARCHAR)+ CAST(d.Id AS VARCHAR) +'0'
END lvl
FROM data d) tmp
ORDER BY tmp.lvl
有点棘手,但不需要使用某些mysql
(ish)函数,例如LEAST