在Postgres中基于另一个表过滤一个表

时间:2019-07-27 16:03:03

标签: postgresql

我有两个带有以下各列的表:

作者

id | name | age

书籍

authorId | title | pages

我需要以某种方式获得拥有200页以上书籍的前五名作者。我尝试了一些类型的联接和子查询,这是我的最佳选择:

SELECT 
    author.name, 
    (SELECT COUNT(*) FROM books WHERE pages > 200 AND 'books.authorId' = 'author.id') AS PageCount 
FROM 
    authors AS author 
ORDER BY 
    PageCount DESC

不幸的是,它返回PageCount为0。

获得所需结果的方式是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用内部联接,计数和分组依据来代替子查询:

    SELECT  au.name, COUNT(*) PageCount
    FROM    authors AS au
    INNER JOIN books ON  "books"."authorId" = au.id 
    WHERE  books.pages > 200 
    GROUP BY au.name
    ORDER BY PageCount DESC

不要在列名周围使用单引号。如果需要,请改用反引号。单引号用于文字字符串,而不用于列名称。