2015-05-04 70 views
0

我正在研究一個項目,我正在吸引用戶和他們最新的博客文章。我們的軟件存儲了一個類似於drupal的版本ID。儘管我在查詢中遇到了很多錯誤。我習慣於編寫MySQL查詢,我認爲這會起作用,但Postegres正在給我提出問題。查詢最近的記錄只能在一對多連接上

Users Table: 
id 
name 
... 

Posts Table: 
id 
authorID 
versoinID 
title 
content 
..... 

SELECT u.id, u.name, p.id, p.versionID p.title FROM Users u LEFT OUTER JOIN Posts p on u.id = p.authorID GROUP BY u.id ORDER BY versionID DESC 

這引發錯誤:列「dcr2.vid」必須出現在GROUP BY子句或聚合函數中使用

我真的很想相處的

線的結果
1 | John | 101 | 1 | How to write Queries 
2 | James | 102 | 1 | Trapped on an island 

其中結果反映最近的博客版本。這是我相信我在MySQL中完成的事情,但我在Postegres中遇到了錯誤。有什麼建議麼?

+0

您的查詢中缺少逗號。不完全相信,如果這將解決問題,雖然:'SELECT u.id,u.name,p.id,p.versionID,p.title' – ryekayo

回答

1

您可以使用窗口函數的Postgres此:

SELECT * 
FROM 
    (
     SELECT u.id, 
      u.NAME, 
      p.id, 
      p.versionID, 
      p.title, 
      ROW_NUMBER() OVER (PARTITION BY u.id ORDER BY p.versionID DESC) as versionRAnk 
     FROM Users u 
     LEFT JOIN Posts p 
      ON u.id = p.authorID 
    )rankQuery 
WHERE rankQuery.versionRank = 1 

這有你的原始查詢(不帶GROUP和ORDER BY位)的子查詢。在子查詢中還有一個窗口函數,它將按照p.versionID對每個userid進行排名。因爲它正在下降,最高的VersionID將得到ROW_NUMBER1。外部查詢只是選擇所有內容,只保留排名爲1的記錄。

+0

這是一個新的方法,我肯定。我看到的唯一問題是我沒有解釋得很好。後來的版本將會是最近的版本。在你的例子中,我看到這是如何工作的,只有版本爲1,但是如果我只需要每個帖子ID的最高版本(通常在所有被查詢的帖子中不一致),該怎麼辦? –

+0

那麼,在這種情況下,您是否想要查看每個人的多個帖子ID?像約翰會顯示郵政編號的1,2,3和4.我假設那麼每個郵政編號可能有多個版本,從中你會想要最新的?如果是這種情況,則在語句的「PARTITION BY」部分添加「p.id」。像'.. ROW_NUMBER()OVER(PARTITION BY u.id,p.id ORDER BY p.versionID DESC)...'。然後它會按人員和帖子分區,然後按降序排列版本。 – JNevill

+0

偉大的解決方案。我在MySQL和Postgres之間發現了一些奇怪的SQL與SQL之間的交叉,但幸運的是,Postgres有一個很棒的社區,幫助我填補這些空白。 –