MYSQL - 具有MAX问题的Group BY

时间:2012-03-26 20:44:30

标签: mysql group-by max

我有下表

  Date, TelephoneNumber, Type
  02/02/12, 123456, b
  04/02/12, 123456, b
  07/02/12, 123456, a
  03/02/12, 789999, a
  15/02/12, 789999, b

运行以下SQL

        select TelephoneNumber, max(Date) as datetime, Type
        from Table1
        where Date > '2012-03-25 00:00'
        group by TelephoneNumber
        order by date desc;

我注意到Type与其相关的Date不匹配。例如,我正在

  07/02/12, 123456, b
  15/02/12, 789999, a

它似乎是在Type中取得第一条记录....即使我在另一方面排序。有人可以帮我解决这个问题吗?我正在使用MySQL

提前致谢。 桑德罗

3 个答案:

答案 0 :(得分:3)

这个问题似乎经常出现。

这是我的解决方案:

SELECT TelephoneNumber, Date AS datetime, Type
from ( SELECT *
       FROM Table1
       WHERE Date > '2012-03-25 00:00'
       ORDER BY Date DESC) AS h
GROUP BY TelephoneNumber
ORDER BY date DESC;

Check explanation here

答案 1 :(得分:2)

这是因为,正如§11.16.3 "GROUP BY and HAVING with Hidden Columns" in the MySQL 5.6 Reference Manual所说:

  

MySQL扩展了GROUP BY的使用范围           select list可以引用未在其中命名的非聚合列           GROUP BY条款。这意味着           前面的查询在MySQL中是合法的。您可以使用此功能           通过避免不必要的列排序获得更好的性能           和分组。但是,这主要适用于所有值           在GROUP BY中未命名的每个非聚合列中,每个组都是相同的。 服务器是免费的           从每个组中选择任何值,因此除非它们相同,           选择的值是不确定的。此外,选择           每组的值不能通过添加来影响           ORDER BY条款。对结果集进行排序           选择值后发生,ORDER BY不影响服务器选择的值。

[强调我的]

相反,你需要写这样的东西:

select t1a.TelephoneNumber, t1a.Date, t1a.Type
  from Table1 as t1a
  left
  join Table1 as t1b
    on t1b.TelephoneNumber = t1a.TelephoneNumber
   and t1b.Date > t1a.Date
 where t1a.Date > '2012-03-25 00:00'
   and t1b.TelephoneNumber IS NULL                -- i.e., the join failed
;

Date的每个值找到TelephoneNumber最大的记录。

答案 2 :(得分:0)

分组后应用订单。已经计算了max(Date)的值,你没有以任何方式对它进行排序。另外,msisdn是什么?无法判断您的查询是什么,因为您实际分组的内容是不透明的。