我想要发生的事情是先按照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>";
}
答案 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和聚合可能会把它们搞砸了)