MySQL按时间戳排序预先排序的记录

时间:2013-07-26 10:17:56

标签: php mysql

我遇到了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";

2 个答案:

答案 0 :(得分:1)

不幸的是,你所看到的帖子是错误的。 MySQL文档明确指出group bygroup 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";