MySQL Group By查询产生不确定的结果

时间:2015-06-10 17:27:47

标签: mysql sql

我有问题...
我有一个请求,但每次刷新请求时,结果都会发生变化 这是我的要求

  SELECT `t`.*, COUNT('ID') AS `tr` FROM (
  SELECT * FROM HISTORY WHERE USER_ID = 1 AND BIEN_ID IS NOT NULL 
  ORDER BY CREATED_AT DESC) AS `t` WHERE (`USER_ID` = 1) 
  GROUP BY `t`.`BIEN_ID` ORDER BY `t`.`CREATED_AT` DESC

我实际上希望按BIEN_ID分组,并使用最新的CREATED_AT字段 有人可以帮助我吗?

例如,我第一次得到这个:

ID   |USER_ID| BIEN_ID | CREATED_AT  
205  |   1   |     36  | 2015-06-10 17:00:36  
203  |   1   |     48  | 2015-06-10 17:00:2 

在我得到这个之后:

ID  | USER_ID| BIEN_ID | CREATED_AT  
202 | 1      | 7       | 2015-06-10 16:31:48  
196 | 1      | 48      | 2015-06-10 16:23:4   

这是我的HISTORY DB:

ID  | USER_ID| BIEN_ID | CREATED_AT  
202 | 1      | 7       | 2015-06-10 16:31:48  
199 | 1      | 48      | 2015-06-10 16:23:40   
196 | 1      | 48      | 2015-06-09 16:23:31  
140 | 1      | 7       | 2015-06-09 10:01:20   
134 | 1      | 30      | 2015-06-04 09:10:11
100 | 1      | 48      | 2015-06-01 11:32:40   

这就是我的期望(我希望GROUP BY ID,COUNT相同的BIEN_ID,并获得最新的CREATED_AT)

ID  | USER_ID| BIEN_ID | COUNT | CREATED_AT  
202 | 1      | 7       | 2     | 2015-06-10 16:31:48  
199 | 1      | 48      | 3     | 2015-06-10 16:23:40   
134 | 1      | 30      | 1     | 2015-06-04 09:10:11  

2 个答案:

答案 0 :(得分:4)

评论太长了。

您正在使用显式 documented的MySQL GROUP BY扩展程序来返回不确定的结果。因此,你不应该对你得到的结果不确定感到惊讶。

问题是您在select *查询中正在执行group bygroup by列是t.bien_id - 我从上下文猜测这不是每行的唯一ID。 (如果是这样,计数将始终为1,并且查询将在逐个运行期间保持一致。)

具体文件是:

  

MySQL扩展了GROUP BY的使用范围,以便选择列表可以参考   未在GROUP BY子句中命名的非聚合列。这意味着   前面的查询在MySQL中是合法的。您可以使用此功能   通过避免不必要的列排序来获得更好的性能   分组。但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。

答案 1 :(得分:1)

select a.id,a.user_id,a.bien_id,a.created_at,b.TOTAL_OCCURANCES from (select *
 from temp1 where created_at in (select MAX(created_at) from temp1 group by
 BIEN_ID))a , (select count(*) as TOTAL_OCCURANCES,BIEN_ID from temp1 group by
 BIEN_ID) b where a.BIEN_ID=b.BIEN_ID order by CREATED_AT desc;

这将完美地按预期工作。

小提琴:http://www.sqlfiddle.com/#!9/f3e43/22/3