两个(在我看来)等效的SQL查询返回不同的结果

时间:2014-09-06 20:03:27

标签: mysql sql group-by sql-order-by

我有这个查询,它会在下面的屏幕截图中返回(正确的)结果:

SELECT owner_id, MAX(ctime) as post_time, aid
FROM `jul_cpg15x_pictures`
GROUP BY aid
ORDER BY aid DESC

Result of Query 1

但是我需要以下格式的查询(因为我想在之后进行一些连接):

SELECT * FROM 
(SELECT owner_id, MAX(ctime) as post_time, aid
FROM `jul_cpg15x_pictures`
GROUP BY aid
ORDER BY aid DESC) q

此查询返回不同的结果(某些owner_ids不同): Result of Query 2

这让我疯狂了几个小时,怎么会这样? 我仔细检查了表中的ctime是不同的,并且没有发生两次。但是例如对于ctime 1410003221,肯定只有一个条目(owner_id = 8)。

非常感谢您的任何帮助或提示。

2 个答案:

答案 0 :(得分:5)

此查询:

SELECT owner_id, MAX(ctime) as post_time, aid
FROM `jul_cpg15x_pictures`
GROUP BY aid
ORDER BY aid DESC

使用部分群组。您选择的是owner_idaid列的未聚合值,但您只能按aid进行分组。对于给定的owner_id组,MySQL可以免费返回任何 aidORDER BY子句无效,因为在分组后执行排序。

因此,如果您的数据如下:

owner_id  ctime       aid
--------  ----------  ---
8         1410003221  176
2         1410000000  176

然后两个结果正确(由于相同的帮助,两个行都折叠为一个,最大ctime按预期计算,但可以返回任一行的owner_id):

owner_id  post_time   aid
--------  ----------  ---
8         1410003221  176
owner_id  post_time   aid
--------  ----------  ---
2         1410003221  176

说了这么多,如果你打算抓住给定owner_id的{​​{1}}最新帖子,你可以写下这样的查询:

aid

答案 1 :(得分:1)

尝试以下操作,如果需要,您可以从表中添加更多列:

select t.owner_id, t.aid, t.ctime
  from jul_cpg15x_pictures t
  join (select aid, max(ctime) as last_post_time,
          from jul_cpg15x_pictures
         group by aid) v
    on t.aid = v.aid
   and t.ctime = v.last_post_time
 order by t.aid desc

如您所说,根据您的意见,此查询将显示每个援助的最后一个post_time,然后显示相应的owner_id。