带零的列上的条件ORDER BY

时间:2014-06-02 19:31:33

标签: mysql sql

我有一个问题,我无法解开。假设我有这张表,items有6条记录

item_id     passage_id
==========  ==========
6           0
5           3
4           0
3           0
2           3
1           3

要通过降序item_id获取记录,我运行语句SELECT * FROM items ORDER BY item_id DESC,结果与上面的源表完全相同。

但现在变得棘手了。我现在想要按降序item_id进行排序,但如果有其他项目具有相同的passage_id,我希望它们按该passage_id分组。

item_id     passage_id
==========  ==========
6           0
5           3
2           3
1           3
4           0
3           0

如何在单个SQL语句中执行此操作?订单至关重要,因为即使使用限制我也需要保留它:

SELECT * FROM items ORDER BY ??? LIMIT 0, 3

item_id     passage_id
==========  ==========
6           0
5           3
2           3

SELECT * FROM items ORDER BY ??? LIMIT 2, 3

item_id     passage_id
==========  ==========
1           3
4           0
3           0

编辑:这是答案,取自Gordon Linoff在下面的答案

SELECT i.item_id, i.passage_id 
FROM items i LEFT JOIN (
    SELECT i.passage_id, MAX(i.item_id) AS imax_id
    FROM items i 
    GROUP BY i.passage_id
) imax 
ON i.passage_id = imax.passage_id 
ORDER BY CASE WHEN i.passage_id=0 THEN i.item_id  ELSE imax.imax_id END DESC, i.item_id DESC;

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要做的事情就是将passage_id放在一起,并按项目ID对这些组进行排序。以下实际上应该这样做:

select i.item_id, i.passage_id
from items i join
     (select i.passage_id, max(i.item_id) as maxiid
      from items i
      group by i.passage_id
     ) imax
     on i.passage_id = i.passage_id
order by imax.maxiid,
         i.item_id desc;

但是,由于passage_id = 0,它不会产生您的订购。对于这些,您似乎希望它们仅基于item_id本身。所以,我认为这封装了你的逻辑:

select i.item_id, i.passage_id
from items i join
     (select i.passage_id, max(i.item_id) as maxiid
      from items i
      group by i.passage_id
     ) imax
     on i.passage_id = i.passage_id
order by (case when i.passage_id = 0 then i.item_id else imax.maxiid end) desc,
         i.item_id desc;