我想根據3列過濾我的數據。sql過濾問題parent_id,id和排序
- PARENT_ID
- 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步:按PARENT_ID ASC如果IS NULL
- 第2步:按PARENT_ID ASC如果IS NOT NULL
數據爲現場測試:http://sqlfiddle.com/#!9/ed850/1
SOLUTION(與教義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
直播結果:http://sqlfiddle.com/#!9/ed850/4
你只曾經有層次的一個水平? (任何一行都是*父母或孩子,永遠不會形成祖父母或更深的關係) –