PHP第一次分拣非空组的列表,然后空组

问题描述:

给定两个表:PHP第一次分拣非空组的列表,然后空组

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排序,那么totsi不会得到我想要的结果。 我希望我很清楚。

+1

你可以添加一个样本输出?我不清楚你想要什么排序。为什么你会先按id排序? *按时间顺序*适合于哪里? – LSerni

+0

@ lserni ok我加了个例子,谢谢 – Francesco

您想对ORDER BY子句中的第一个位置的其他列进行排序(以使其最相关)。您无法直接在tots上排序,因为这会破坏user_to_group_id上的排序。因此,您需要将除0之外的所有值都映射为单个值 - 例如, 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 <> 0,将排在第一位,然后那些tots = 0其余的排序是相同的。

如果您想了解更多关于CASE看看文章,我写在这里:http://modern-sql.com/feature/case

+0

哇从来没有听说过CASE,谢谢!! – Francesco