MySQL GROUP BY不连贯

时间:2014-10-21 09:32:42

标签: 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.IDs(为了便于阅读而显示的用户名):

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

这里,vmax值是错误的,因此顺序错误。我甚至不知道这些值来自哪里:每个u.ID的vmax值甚至不匹配查询计算的每个用户的最后插入的vmax(如果我添加{{1},我可以显示在c.ID部分),也不是第一个。它们确实属于每个用户,但它们按时间顺序排列。

我尝试过很多东西,研究和阅读很多(例如this link似乎很有希望),但对我来说,上面的最后一点不起作用并没有多大意义。有谁看到我搞砸了?

谢谢!

1 个答案:

答案 0 :(得分:2)

仅使用汇总功能MAXu.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