2

我有这个查询在某种程度上起作用。它返回“评级”的正确值(输出为 7,最高评级),但“内容”的输出来自表中的不同行。(不是评分最高的行,即 7)

$bestAnswerQuery = MYSQL_QUERY("SELECT content, MAX(rating) as rating FROM answers WHERE questionID = '$questionID'");

$fetchBestAnswer = MYSQL_FETCH_ASSOC($bestAnswerQuery);

echo "$fetchBestAnswer[content] $fetchBestAnswer[rating]";

谁能告诉我为什么?我已经搜索过,但无法找出为什么它不能正常工作。

4

2 回答 2

8

这不是聚合MAX在 SQL 中的工作方式。您的困惑来自 MySQL(默认)对聚合的非 ANSI 处理。

聚合喜欢MAX对组进行操作。在没有group by子句的情况下,整个结果集被视为一个组。只有作为group by子句一部分的表达式才能包含在select子句中,而不包含在聚合中。如果没有group by,则select子句中的所有列或表达式都必须包含在聚合中。

然而,MySQL 的默认配置打破了这一点,允许您在子句中包含非分组表达式select,但是任何给定表达式用于获取其值的行是未定义的;它可以是组内的任何行。

在那个冗长的答案之后,如果你想要得到的是给定问题的最大值rating和表中的相关content列,你可以这样做:

select 
    rating, 
    content 

from answers 

where questionID = '$questionID' 

order by rating desc 

limit 1;
于 2012-04-25T03:41:57.080 回答
0

像这样更改查询:

$bestAnswerQuery = mysql_query("SELECT content, rating as rating 
          FROM answers 
          WHERE questionID = '$questionID'
            AND rating = MAX(rating)");
于 2012-04-25T03:40:48.473 回答