我有一张这样的桌子——
id name ordering catid
1 parent1 1 0
2 parent2 2 0
3 parent3 3 0
4 child11 1 1
5 child12 2 1
6 child21 1 2
7 child22 2 2
8 child31 1 3
9 child32 2 3
Run Code Online (Sandbox Code Playgroud)
我试图得到如下结果-
id name ordering catid
1 parent1 1 0
4 child11 1 1
5 child12 2 1
2 parent2 2 0
6 child21 1 2
7 child22 2 2
3 parent3 3 0
8 child31 1 3
9 child32 2 3
Run Code Online (Sandbox Code Playgroud)
我想订购第一个而parent(catid=0)不是它的孩子而不是第二个父母和它的孩子。这是否可以通过这些列实现预期结果。我尝试加入但没有成功。当然,我没有正确地做到这一点。这是我尝试过的-
SELECT a.*,c.name AS category_title FROM table AS a
LEFT JOIN table AS c ON c.id = a.catid
ORDER BY c.ordering asc, a.ordering asc
Run Code Online (Sandbox Code Playgroud)
该查询将SELF JOIN在同一个表上执行 a ,方法是将第一个表中的记录与相应的父记录连接起来。如果父级存在,则列 parentId 将包含记录的父级 ID,否则为记录本身的 ID。然后按 parentId 和 ID 对结果进行排序,以便父项始终显示在给定的父项及其子项组的顶部。
SELECT
m.id,
m.name,
m.catid,
m.ordering,
p.ordering,
case
WHEN p.ordering IS NULL THEN m.ordering * 10
ELSE m.ordering + p.ordering * 10
END AS parentId
FROM
MyTable m
LEFT JOIN MyTable p
ON m.catid = p.id
ORDER BY parentId
Run Code Online (Sandbox Code Playgroud)
结果如下:
1 parent1 0 1 10
4 child11 1 1 1 11
5 child12 1 2 1 12
2 parent2 0 2 20
6 child21 2 1 2 21
7 child22 2 2 2 22
3 parent3 0 3 30
8 child31 3 1 3 31
9 child32 3 2 3 32
Run Code Online (Sandbox Code Playgroud)