-1

我在使用 MySQL 查询时遇到问题。我一直在关注:如何从 mysql 表中选择最新的日期记录集,而我正在尝试做的是选择最近的记录并按 sales_total 字段对其进行排序。所以首先我必须按 max(timestamp) 排序,然后再按 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";
4

2 回答 2

1

不幸的是,您正在查看的帖子是错误的。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。第二个是您需要包含namegroup byfor 子查询中。如果您希望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;
于 2013-07-26T10:52:41.637 回答
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";
于 2013-07-26T10:44:35.820 回答