我正在开展一个我吸引用户及其最新博文的项目。我们的软件存储了类似于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
这会抛出错误:column" dcr2.vid"必须出现在GROUP BY子句中或用于聚合函数
我真的很想得到
的结果1 | John | 101 | 1 | How to write Queries
2 | James | 102 | 1 | Trapped on an island
结果反映了最新的博客版本。这是我相信我在MySQL中所做的事情,但我在Postegres中遇到错误。有什么建议吗?
答案 0 :(得分: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位)作为子查询。在子查询中还有一个窗口函数,它将为每个userid
按p.versionID
对记录进行排名。因为它正在下降,所以最高VersionID
将获得ROW_NUMBER
的{{1}}。外部查询只选择所有内容,只保留排名为1
的记录。