给定两个表:
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
我正在尝试显示组列表,在顶部我有包含项目的组,然后是空组。
将这些群组想象成电子商务中的商品愿望 list 。作为用户,我可以建立多个群组。
例如。 目前我显示
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 得不到我想要的结果。 我希望我是清楚的。
最佳答案
您想对位于 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
<> 0 的将排在第一位,然后是 tots
= 0 的。其余排序相同。
如果您想了解有关CASE
的更多信息,请查看我在这里写的一篇文章:http://modern-sql.com/feature/case
关于PHP 首先对非空组列表进行排序,然后是空组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40494127/