我遇到了MySQL查询问题。 我一直在关注:How to select the most recent set of dated records from a mysql table我正在尝试做的是选择最有效的记录并按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脚本中执行相同的查询,则会出现Query Failed错误。任何人都知道为什么以上似乎在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";
答案 0 :(得分:1)
不幸的是,你所看到的帖子是错误的。 MySQL文档明确指出group by
在group by
子句中未指定列时为列选择任意值。
以下是here的明确引用。
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
子查询。如果您希望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;
答案 1 :(得分:0)
尽管使用\'
引号,但在您的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";