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


MySQL Sorting pre-sorted records by timestamp

我的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";