PHP首先对非空组列表进行排序,然后对空组进行排序
给出两个表格:PHP首先对非空组列表进行排序,然后对空组进行排序,php,mysql,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_
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
因此,我想先按时间顺序(我不存储时间戳,但组id应该足够了)显示非空组,然后按时间顺序显示空组列表的所有其余部分
这里的问题是,如果我按id排序,那么totsi不会得到我想要的结果。
我希望我说得很清楚。您想在您的
ORDER BY
子句的第一个位置的附加列上排序(以使其最相关)。您不能直接在tots
上排序,因为这会破坏user\u to\u group\u id
上的排序。因此,您需要将除0以外的所有tot
值映射到单个值,例如1。这可以使用案例
,给出以下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的人。其余的排序是相同的
如果您想了解更多有关
案例的信息,请阅读我在这里写的一篇文章:您想在ORDER BY
子句的第一个位置的附加列上排序(以使其最相关)。您不能直接在tots
上排序,因为这会破坏user\u to\u group\u id
上的排序。因此,您需要将除0以外的所有tot
值映射到单个值,例如1。这可以使用案例
,给出以下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
的信息,请看我在这里写的一篇文章:您可以添加一个示例输出吗?我不清楚你想要什么。你为什么要先按id排序?那么按时间顺序应该放在哪里呢?@lserni好的,我添加了这个示例,谢谢您添加一个示例输出?我不清楚你想要什么。你为什么要先按id排序?那么按时间顺序应该放在哪里呢?@lserni好的,我添加了这个例子,谢谢