PHP 首先对非空组列表进行排序,然后是空组

标签 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

我正在尝试显示组列表,在顶部我有包含项目的组,然后是空组。

将这些群组想象成电子商务中的商品愿望 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/

相关文章:

MySQL InnoDB 约束不起作用

php - 通过 ftp 双向同步 Netbeans 中的项目

mysql - 使所有自动递增整数的位数相同,前导零

php - 当 table1 中删除行时,在 table2 中插入行

mysql - 如何优化这个删除查询?

mysql - 不想要在 MySQL 中减法的负结果

php - 准备数据以在数据库中插入 ST_GeomFromText (Codeigniter + MySql)

php - php.ini upload_max_filesize 合并了吗?

php - 从 WordPress 中的自定义表返回变量(从 URL 检索后)

php - 选择多个类名并使用 PHP DOMXpath 在该类中获取子节点