2012-03-26 115 views
1

我有如下表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; 

我注意到,类型不匹配其相关的日期时。比如我正在

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

它似乎正在类型中的第一个记录....即使我倒过来排序。有人能帮我解决这个问题吗?我正在使用MySQL

在此先感谢。 sandro

+2

MySQL的小组,由功能使用第一个遇到的行填写在一个结果行任何非分组字段的值。这对于像您的简单查询语句是不可避免的。看到这个问答:http://stackoverflow.com/questions/979034/mysql-shows-incorrect-rows-when-using-group-by – 2012-03-26 20:48:31

+0

什么是你正期望发生。问一个更直接的问题总是更好。 – kasavbere 2012-03-26 21:00:35

回答

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

0

订单在分组后应用。 max(Date)的值已经被计算出来了,你不会以任何方式对它进行排序。另外,什么是msisdn?你不可能知道你的查询是怎么回事,因为你实际上分组的内容是不透明的。

+0

这是一个错误的:)现在请检查 – mouthpiec 2012-03-26 20:52:22

2

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

MySQL的扩展使用GROUP BY使得 选择列表可参考 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每个值。