仅在1对多连接上查询最新记录

时间:2015-05-04 18:06:15

标签: postgresql

我正在开展一个我吸引用户及其最新博文的项目。我们的软件存储了类似于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中遇到错误。有什么建议吗?

1 个答案:

答案 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位)作为子查询。在子查询中还有一个窗口函数,它将为每个useridp.versionID对记录进行排名。因为它正在下降,所以最高VersionID将获得ROW_NUMBER的{​​{1}}。外部查询只选择所有内容,只保留排名为1的记录。