PHP首先排序非空组列表,然后排空组

时间:2016-11-08 18:36:57

标签: php mysql

给出两个表:

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没有得到我想要的结果。 我希望我很清楚。

1 个答案:

答案 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