2

为什么这个查询会给出奇怪的结果..

SELECT max(greatest(home_team_total,away_team_total)) AS max_team_score, id 
FROM `match`
WHERE id IN (1,2,3,4,5)

尽管

SELECT greatest(home_team_total,away_team_total) AS max_team_score, id 
FROM `match`
WHERE id IN (1,2,3,4,5)
ORDER BY max_team_score DESC
LIMIT 1

给出正确的结果..

最大值仅在两种情况下都是正确的,但匹配的 id 在第一种情况下是错误的..

4

2 回答 2

3

这是因为您id在 SELECT 子句中包含该字段。你要哪个id?我知道您可能想要与最大行关联的一个,但可能有多个,如果您也返回min(greatest(home_team_total,away_team_total))怎么办?

第二个查询是您想要解决此问题的查询。

编辑使其更清晰:

您的查询相当于:

SELECT max(greatest(home_team_total,away_team_total)) AS max_team_score, ANY(id)
FROM `match`
WHERE id IN (1,2,3,4,5)

看看http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

它说:“服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的。”

于 2012-06-21T05:02:43.000 回答
0

如果您确实希望第一个查询起作用,则必须将其更改为如下所示:

选择最好的(home_team_total,away_team_total)作为 max_team_score,id FROM match WHERE best(home_team_total,away_team_total) = ( SELECT max(greatest(home_team_total,away_team_total)) FROM match )

请注意,结果中可以有不止一行,所以我更喜欢这个解决方案而不是“LIMIT 1”替代方案。

于 2012-06-21T05:12:20.963 回答