我的MySQL查询有问题。我一直在关注:如何从mysql表中选择最新的一组日期记录,我要做的是选择最频繁的记录,并按sales_total字段进行排序。因此,首先我必须按max(时间戳)排序,然后再按sales_total排序。我修改了上面提供的解决方案如下:
$query = "(SELECT * FROM (SELECT * FROM table_name WHERE year =''2013'' AND category=''Network'' ORDER BY timestamp DESC) as t1 GROUP BY name) ORDER BY sales_total DESC";
$result = mysql_query($query) or die("Query failed");
这在PHPMyadmin中运行得很好,但是,如果我尝试在PHP脚本中执行相同的查询,我会收到"查询失败"错误。有人知道为什么以上内容在PHPMyadmin中有效,但在PHP中无效吗?
我的PHP查询如下:
$query = "(SELECT * FROM (SELECT * FROM table_name WHERE category=''Network'' ORDER BY timestamp DESC) as t1 GROUP BY name) ORDER BY sales_total DESC";
不幸的是,您看到的帖子是错误的。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;
有两个问题。一个是on
中第三个子句之前缺少and
。第二个是,您需要在子查询的group by
中包含name
。如果您希望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;
在PHP代码中,尽管使用了"
引号,但仍有''
。此外,您似乎有一些超精细(可能会导致错误)的括号。因此,请尝试将PHP查询字符串更改为
$query = "SELECT *
FROM (
SELECT *
FROM table_name
WHERE category='Network'
ORDER BY timestamp DESC
) as t1
GROUP BY name
ORDER BY sales_total DESC";