【发布时间】:2017-09-26 15:56:47
【问题描述】:
我想根据 3 列过滤我的数据。
- parent_id
- 身份证
- 排序
基本 BDD 示例:
id | parent_id | sort | text
-----------------------------
1 | NULL | 3 | D
2 | 10 | 0 | AA
3 | NULL | 1 | B
4 | 10 | 2 | AB
5 | 3 | 0 | BA
6 | 8 | 0 | CA
7 | 3 | 2 | BC
8 | NULL | 2 | C
9 | 3 | 1 | BB
10 | NULL | 0 | A
11 | 1 | 0 | DA
我想得到这个结果:
id | parent_id | sort | text
-----------------------------
10 | NULL | 0 | A
2 | 10 | 0 | AA
4 | 10 | 2 | AB
3 | NULL | 1 | B
5 | 3 | 0 | BA
9 | 3 | 1 | BB
7 | 3 | 2 | BC
8 | NULL | 2 | C
6 | 8 | 0 | CA
1 | NULL | 3 | D
11 | 1 | 0 | DA
我尝试使用COALESCE 函数但没有成功:SELECT * FROM menu ORDER BY COALESCE(parent_id, id) ASC, parent_id ASC, sort ASC。
我认为有一个通过COALESCE函数优先级设置的顺序逻辑...我不确定...
- 第 1 步:如果 IS NULL,则按 parent_id ASC 排序
- 第 2 步:如果 IS NOT NULL,则按 parent_id ASC 排序
现场测试数据:http://sqlfiddle.com/#!9/ed850/1
解决方案(为 symfony 工作)
感谢@quadzz和其他人的回答
SELECT test.*,
( CASE
WHEN test.parent_id IS NULL THEN test.sort
ELSE test_1.sort
END ) AS test1,
( CASE
WHEN test.parent_id IS NULL THEN 1
ELSE 0
END ) AS test2
FROM test AS test
LEFT JOIN test AS test_1
ON ( test_1.id = test.parent_id )
ORDER BY test1 ASC,
test2 DESC,
test.sort ASC
【问题讨论】:
-
你只有一个层次结构吗? (任何一行都是要么父母或孩子,永远不会同时形成祖父母或更深层次的关系)