2014-09-06 76 views
1

我有这个查询返回下面的截图(正确的)结果:两个(在我看来),相当于SQL查询返回不同的结果

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的条目)。

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

+0

OWNER_ID在您的SELECT列表中,但不在GROUP BY子句中,尽管在SELECT列表中使用了聚合函数。 – 2014-09-06 20:05:58

+1

如果您选择一个未分组的列,您只需从该组中获得一个随机值。除MySQL以外的大多数数据库都会认为这个SQL是一个错误。 – Laurence 2014-09-06 20:06:10

+0

您是否想要每个AID或每个OWNER_ID和AID组合的最高发布时间(ctime)? – 2014-09-06 20:07:57

回答

5

这个查询:

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

通过使用正部分组。您正在选择未分类的值owner_idaid列,但您只分组aid。对于给定的aid组,MySQL可以自由地返回的任何owner_idORDER BY子句不起作用,因为分组后执行排序。

所以,如果你的数据是这样的:

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

然后,两个结果正确(两行合并为一个,因为同样的援助,无论从行可以返回预期,但owner_id计算最大的ctime ):

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

说了如果需要的话

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 
+0

对不起,我不太明白。我的查询中有MAX(ctime),如果结果不是唯一的? 查询应该(在我的opinton中)通过援助组,并采取最大的相应ctime和与此ctime相对应的owner_id。我错了吗? – Fabi 2014-09-06 20:22:51

+1

查询要求(i)通过援助对结果进行分组(ii)然后为每个组返回MAX(ctime);它没有提到要返回每个组的哪个owner_id(最小,最大或串联)。 – 2014-09-06 20:26:42

+1

我没有听说过“部分分组”这个词。这是文档明确警告不要使用的MySQL扩展:http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html。 – 2014-09-06 20:39:54

1

尝试以下几点,就可以从表中添加更多的列:是,如果你的目的是要抓住最新帖子的owner_id对于给定aid你可以写你这样的查询

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。

相关问题