2015-05-04 98 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有一个很棒的社区,帮助我填补这些空白。 –