我有一张这样的桌子-
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
我正在尝试获得如下结果-
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
我要订购的第二个父级及其子级要比其子级的第一个父级(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
解决方法:
通过将第一个表中的记录与相应的父记录联接起来,此查询将对同一表执行SELF JOIN.如果存在父记录,则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
结果如下:
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
标签:sql,mysql
来源: https://codeday.me/bug/20191127/2074739.html