Mysql查询Max无法正常工作

时间:2012-02-27 18:02:24

标签: mysql

我想要发生的事情是先按照parentid分组,然后逐个分组,我已经完成了。在该组中,我希望显示具有最高评级的名称,这不会发生。而是显示每个组的最低ID。结果应该是tv1,tv3,tv5,tv7;因为这些是每组的最高评级值。

  id |  name| parentid|  position| rating  |
   1 |  tv1 |    1    |    1     |    6    |
   2 |  tv2 |    1    |    2     |    5    |
   3 |  tv3 |    1    |    2     |    7    |
   4 |  tv4 |    1    |    2     |    3    |
   5 |  tv5 |    5    |    1     |    8    |
   6 |  tv6 |    5    |    1     |    2    |
   7 |  tv7 |    3    |    1     |    9    |
   8 |  tv8 |    3    |    1     |    3    |



    $getquery = mysql_query("SELECT name,MAX(rating) FROM outcomes GROUP BY position,parentid") or die(mysql_error());

while($row=mysql_fetch_assoc($getquery)) {

$name = $row['name'];
$rating = $row['rating'];

echo "<p>Name: $name - $rating</p><p></p>";

}

1 个答案:

答案 0 :(得分:4)

并不是显示最低的ID - 您实际上并没有选择id列。您可能看到的是每个组的name列中的第一个条目。

SELECT name, MAX(rating)

不会按照您的想法执行操作 - 它不会指示MySQL从评级列中选择最大值,还会返回与该行关联的名称(除此之外:您认为它会怎样?如果最高等级达到平局则返回?如果您使用AVERAGE而不是MAX,您认为它会返回什么?)

它的作用是返回正确计算的MAX(评级),然后返回该组中的一个名称。它不保证返回哪一个,并且它可以根据它决定执行查询的方式而改变。

事实上,由于诸如此类的查询的未定义特性,它甚至不是其他数据库中的合法SQL。 (在Postgres中试试这个,你会收到一个错误。哎呀,在启用了ONLY_FULL_GROUP_BY选项的情况下在MySQL中试一试,你会得到类似的错误)

如果你想要做的是找到每个组的最高评级,然后找到与之相关的名称,你必须做这样的事情:

SELECT name, max_rating FROM outcomes
JOIN (SELECT position, parentid, MAX(rating) AS max_rating from outcomes group by position, parentid) AS aggregated_table
USING (position, parentid)
WHERE rating = max_rating

(有四到五种其他方法可以做到这一点,在这个网站上搜索mysql和聚合可能会把它们搞砸了)