【发布时间】:2020-01-03 20:08:50
【问题描述】:
我继承了生成此 SQL 的 CodeIgniter 查询
示例:
SELECT `users`.`id`, `users`.`username`, `users`.`email`, `users`.`photo`, `users`.`rating`
FROM `pool_details`
JOIN `users` ON `users`.`id` = `pool_details`.`captain_id`
WHERE `pool_details`.`pool_type` =0
AND `pool_details`.`pool_close` > '2020-01-02 18:39:42'
GROUP BY `pool_details`.`captain_id`
ORDER BY `pool_details`.`members_count` DESC
LIMIT 20
ERROR - 2020-01-02 18:39:42 --> 查询错误:ORDER BY 的表达式 #1 子句不在 GROUP BY 子句中并且包含非聚合列 'pool_details.members_count' 这不是功能 依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by - 无效查询:
以下是相同的数据,其中包含一些“额外的列”并删除了违规子句:
SELECT users.id, users.username, users.email,users.rating,pool_details.members_count,pool_details.pool_type,pool_details.pool_close
FROM pool_details
JOIN users ON users.id = pool_details.captain_id
WHERE pool_details.pool_type = 0 AND pool_details.pool_close > '2020-01-02 18:39:42'
ORDER BY pool_details.members_count DESC;
//GROUP BY `pool_details`.`captain_id`
+----+----------+--------------------------+--------+---------------+-----------+---------------------+
| id | username | email | rating | members_count | pool_type | pool_close |
+----+----------+--------------------------+--------+---------------+-----------+---------------------+
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 | 100 | 0 | 2020-01-04 03:00:00 |
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 | 100 | 0 | 2020-01-03 23:30:00 |
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 | 100 | 0
...
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 | 0 | 0 | 2020-01-03 00:00:00 |
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 | 0 | 0 | 2020-01-03 00:30:00 |
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 | 0 | 0 | 2020-01-04 21:30:00 |
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 | 0 | 0 | 2020-01-03 03:00:00 |
+----+----------+--------------------------+--------+---------------+-----------+---------------------+
28 rows in set (0.00 sec)
我想要的是:
- 显示用户的用户名、电子邮件和评分
- 按“members_count”排序
- 只向用户显示一次
例如:
SELECT DISTINCT users.id, users.username, users.email,users.rating
FROM pool_details
JOIN users ON users.id = pool_details.captain_id
WHERE pool_details.pool_type = 0 AND pool_details.pool_close > '2020-01-02 18:39:42';
+----+----------+--------------------------+--------+
| id | username | email | rating |
+----+----------+--------------------------+--------+
| 5 | wheel | wheel@boxpik.com | NULL |
| 13 | Ronaldo | pulisicblues07@gmail.com | 4.6 |
+----+----------+--------------------------+--------+
2 rows in set (0.00 sec)
<= This shows the users individually ... but it's *NOT* ordered by "members_count".
问:我可以在 mySql 5.7 中使用“GROUP BY”和/或“DISTINCT”的任何组合来获得我需要的结果集吗?
【问题讨论】:
-
如果我们知道
members_count是功能相关的(即我们知道折叠组中所有行中members_count列的值相同),那么我们可以包装在一个聚合函数中。例如ORDER BY MAX(pool_details.members_count) DESC。 (我们可以使用 MIN() 代替 MAX(),结果将是相同的,如果我们保证折叠组中的所有行具有相同的值members_count,那么我们知道MIN(members_count) <=> MAX(members_count) -
您想在 ORDER BY 中使用用户可能拥有的所有“members_count”?
-
@spencer7593:这就是解决方案!谢谢!这是我更新的 SQL。如果您发布答案;我很乐意投票并“接受”它。
SELECT users.id, users.username, users.email,users.rating FROM pool_details JOIN users ON users.id = pool_details.captain_id WHERE pool_details.pool_type = 0 AND pool_details.pool_close > '2020-01-02 18:39:42' GROUP BY pool_details.captain_id ORDER BY MAX(pool_details.members_count) DESC; -
@FoggyDay:我的评论不是对所问问题的回答,如果 GROUP BY 和 DISTINCT 的组合......如果
members_count在功能上不依赖,那么回应来自的评论forpas,我们要使用members_count的哪些可能值?使用 MAX 和 MIN 选择最大值和最小值很容易,但也许我们想要与最早或最新的pool_close关联的值......我们只是在猜测,因为我们没有;没有更精确的规范 -
叹息...我没有说“和”;我说“和/或”。从某种意义上说,“任何语法都可以消除错误”。你给了我答案:“MAX()”。这个答案是有道理的:我们想要一个aggregate。具体来说:成员最多的队长上,第二多的队长,等等。如果你给出回应,我会“接受”它。