2014-09-06 73 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。

相關問題