不幸的是,您正在查看的帖子是错误的。MySQL 文档明确指出,当子句group by
中未指定列时,将为列选择任意值。group by
这是来自这里的明确引用。
MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 ORDER BY 子句的影响。结果集的排序发生在选择值之后,并且 ORDER BY 不会影响服务器选择每个组中的哪些值。
正确的方法(这是标准 SQL)是计算适当的最大时间戳,然后将结果重新加入:
SELECT t.*
FROM table_name t join
(select name, year, category, max(timestamp) as maxts
from table_name
WHERE year ='2013' AND category='Network'
group by name, year, category
) tn
on t.name = tn.name and
t.year = tn.year and t.category = tn.category and t.timestamp = tn.maxts
ORDER BY sales_total DESC;
编辑:
这是您的查询:
SELECT t.*
FROM annualtable t join
(SELECT year, name, max(countries)
FROM annualtable
WHERE name NOT LIKE '%No Entries%' and year <> '0'
GROUP BY year
ORDER BY year
) tn
on t.name = tn.name and t.year = tn.year t.countries = tn.countries
ORDER BY year DESC;
有两个问题。and
一个是在第三个子句之前的缺失on
。第二个是您需要包含name
在group by
for 子查询中。如果您希望order by
做任何事情,您可能会遇到另一个问题。请参阅文档中的上述参考。所以,你可能想要这个:
SELECT t.*
FROM annualtable t join
(SELECT year, name, max(countries)
FROM annualtable
WHERE name NOT LIKE '%No Entries%' and year <> '0'
GROUP BY year, name
) tn
on t.name = tn.name and t.year = tn.year and t.countries = tn.countries
ORDER BY year DESC;