给出两个表:
item_to_group ---> contain item_id , user_to_group_id
user_to_group ---> contain user_to_group_id , user_id, // other not relevant columns like group name...
这是我的mysql代码:
SELECT *,
(SELECT COUNT(*) FROM item_to_group x
WHERE x.user_to_group_id = u.user_to_group_id) as tots
FROM user_to_group u
WHERE u.user_id = // [ USERID HERE ]
ORDER BY u.user_to_group_id DESC, tots DESC
我正在尝试显示一个组列表,在顶部我有包含项目的组,然后是空组。
想象一下这些群体就像电子商务中的物品愿望清单。作为用户,我可以构建多个组。
例如。 目前我显示
group 99 contains 2 items
group 98 contains 0 items // <--- empty
group 97 contains 5 items
group 96 contains 1 items
group 94 contains 0 items // <--- empty
group 93 contains 9 items
group 92 contains 3 items
但我想显示
group 99 contains 2 items
group 97 contains 5 items
group 96 contains 1 items
group 93 contains 9 items
group 92 contains 3 items
-------------------------
group 98 contains 0 items
group 94 contains 0 items
所以我想首先按时间顺序显示非空的组(我不存储时间戳,但我认为组ID应该足够了)然后是空组列表的所有其余部分。
这里的问题是,如果我按ID排序那么totsi没有得到我想要的结果。 我希望我很清楚。
答案 0 :(得分:0)
您希望在ORDER BY
子句的第一个位置对其他列进行排序(以使其最相关)。您无法直接对tots
进行排序,因为这会破坏user_to_group_id
上的排序。因此,您需要将除0以外的所有tots
值映射到单个值 - 例如1.这可以使用CASE
完成,给出以下ORDER BY
子句:
ORDER BY CASE WHEN tots = 0 THEN 0 ELSE 1 END DESC
, u.user_to_group_id DESC
, tots DESC
现在,有tots
&lt;&gt;的人0,将排在第一位,然后排在tots
= 0的位置。剩下的排序是相同的。
如果您想详细了解CASE
,请查看我在此处撰写的文章:http://modern-sql.com/feature/case