php - MySQL GROUP BY 不一致

标签 php mysql

我遇到查询问题,更具体地说是 GROUP BY 函数。

查询工作完美,并以正确的顺序返回正确的结果,但是当我尝试按用户 ID 分组时,它搞乱了一切。

SELECT u.ID, GREATEST( IF(c.climb_length >= 1, r.cotation_1, 0)
, IF(c.climb_length >= 2, r.cotation_2, 0)
, IF(c.climb_length >= 3, r.cotation_3, 0)
, IF(c.climb_length >= 4, r.cotation_4, 0)
, IF(c.climb_length >= 5, r.cotation_5, 0)
, IF(c.climb_length >= 6, r.cotation_6, 0)
, IF(c.climb_length >= 7, r.cotation_7, 0)
, IF(c.climb_length >= 8, r.cotation_8, 0)
, IF(c.climb_length >= 9, r.cotation_9, 0)
, IF(c.climb_length >= 10, r.cotation_10, 0)
) AS vmax
FROM users u
INNER JOIN climbs c
ON c.user_id = u.ID
INNER JOIN routes r
ON c.route_id = r.ID
GROUP BY vmax, u.ID
ORDER BY vmax DESC

这会返回类似的内容,这与我想要的很接近,除了重复的 u.ID(为了便于阅读而显示的用户名):

问题是,我只想要每个 u.ID 的最高 vmax - 每个 u.ID 只出现一次。因此,如果我执行相同的请求,但仅使用 GROUP BY u.ID,我会得到这个,这是没有意义的:

这里,vmax 值是错误的,因此顺序是错误的。我什至不明白这些值来自哪里:每个 u.ID 的 vmax 值甚至与查询计算的每个用户最后插入的 vmax 不匹配(我可以表明,如果我添加 c.ID SELECT 部分),也不是第一个。它们确实属于每个用户,但它们按时间顺序分布在各处。

我尝试了很多事情,研究并阅读了很多内容(例如 this link 似乎很有希望),但对我来说,上面最后一点不起作用没有多大意义。有人看到我哪里搞砸了吗?

谢谢!

最佳答案

仅使用聚合函数MAX并按u.ID分组:

SELECT u.ID, MAX(GREATEST( IF(c.climb_length >= 1, r.cotation_1, 0)
, IF(c.climb_length >= 2, r.cotation_2, 0)
, IF(c.climb_length >= 3, r.cotation_3, 0)
, IF(c.climb_length >= 4, r.cotation_4, 0)
, IF(c.climb_length >= 5, r.cotation_5, 0)
, IF(c.climb_length >= 6, r.cotation_6, 0)
, IF(c.climb_length >= 7, r.cotation_7, 0)
, IF(c.climb_length >= 8, r.cotation_8, 0)
, IF(c.climb_length >= 9, r.cotation_9, 0)
, IF(c.climb_length >= 10, r.cotation_10, 0)
)) AS vmax
FROM users u
INNER JOIN climbs c
ON c.user_id = u.ID
INNER JOIN routes r
ON c.route_id = r.ID
GROUP BY u.ID
ORDER BY vmax DESC

关于php - MySQL GROUP BY 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26483394/

相关文章:

java - Dockerized Mac/Java 应用程序无法与本地主机通信

javascript - 为什么我的 websocket php+javascript 代码不起作用?

MySQL多次引用同一个表

php - 登录后如何使用sql中的session获取两张表的数据,但是我登录时使用了1张表的数据

javascript - 生成word文件后如何重定向php页面

mysql - 我是否必须删除主键或重新加载表数据才能在 MySQL InnoDB 中进行分区?

存储在 APC 中的 php 对象删除 mySQL 链接

mysql - 选择最后已知的作业,但仅适用于最新的人

Php openSSL 加密 - 防止特殊字符

php - 单独的主题标签和文本 PHP