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不会得到我想要的结果。 我希望我很清楚。
答
您想对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
你可以添加一个样本输出?我不清楚你想要什么排序。为什么你会先按id排序? *按时间顺序*适合于哪里? – LSerni
@ lserni ok我加了个例子,谢谢 – Francesco