我有一个问题,我无法解开。假设我有这张表,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;
答案 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;