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

Fab*_*abi 1 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
Run Code Online (Sandbox Code Playgroud)

查询结果1

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

SELECT * FROM 
(SELECT owner_id, MAX(ctime) as post_time, aid
FROM `jul_cpg15x_pictures`
GROUP BY aid
ORDER BY aid DESC) q
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢你的任何帮助或提示.

Sal*_*n A 5

这个查询:

SELECT owner_id, MAX(ctime) as post_time, aid
FROM `jul_cpg15x_pictures`
GROUP BY aid
ORDER BY aid DESC
Run Code Online (Sandbox Code Playgroud)

使用部分组.您正在选择未聚合的值owner_idaid列,但您只是按分组进行分组aid.MySQL可以为给定的组自由返回任何内容 .该子句没有帮助,因为分组执行排序.owner_idaidORDER BY

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

owner_id  ctime       aid
--------  ----------  ---
8         1410003221  176
2         1410000000  176
Run Code Online (Sandbox Code Playgroud)

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

owner_id  post_time   aid
--------  ----------  ---
8         1410003221  176
Run Code Online (Sandbox Code Playgroud)
owner_id  post_time   aid
--------  ----------  ---
2         1410003221  176
Run Code Online (Sandbox Code Playgroud)

说了这么多,如果你打算抓住owner_id给定的最新帖子,aid你可以像这样编写你的查询:

SELECT s1.aid, s1.ctime, s1.owner_id
FROM jul_cpg15x_pictures s1
JOIN (
    SELECT aid, MAX(ctime) AS ctime
    FROM jul_cpg15x_pictures
    GROUP BY aid
) AS s2 ON s1.aid = s2.aid AND s1.ctime = s2.ctime
Run Code Online (Sandbox Code Playgroud)