5

我有一张这样的桌子-

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

我想订购第一个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
4

3 回答 3

5

此查询将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

结果如下:

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
于 2012-10-13T13:39:44.137 回答
0

这可能是我认为的一种实现方式,但不确定它会有多好。

  • 向名为weight的表添加一个额外的属性。
  • 如果任何行是子行,则该权重将为 (catid*maximum_id+ordeing) 否则权重将为 (ordering*maximum_id) [可以通过在两个条件下两次更改权重属性来完成]
  • 现在选择您需要的并按重量排序。
  • 从表中删除列权重
于 2012-10-13T14:03:55.480 回答
0

使用 ID 计算实际上不起作用,如果您有足够的记录,您可能会溢出。

这个更好:

SELECT a.*,c.name AS category_title FROM table AS a 
LEFT JOIN table AS c ON c.id = a.catid 
ORDER BY 
case c.ordering when 0 then a.ordering else c.ordering, a.ordering 
于 2014-08-11T15:52:51.993 回答