在postgres中的第一个表上左连接预过滤

时间:2016-02-02 20:18:52

标签: sql postgresql psql

我想运行查询以获取相册中的用户相册ID,姓名和图片计数。此查询有效:

SELECT album.id, album.name, count(pictures.*)
FROM album
LEFT JOIN pictures
    ON (pictures.album_id=album.id)
WHERE album.owner = ?
GROUP BY album.id;

我有大量的图片和很多相册,但是在为我感兴趣的用户进行过滤之前,联接正在运行。

我已经看到其他答案根据第二个表格的值在连接内部进行过滤,但我想过滤第二个表格中未包含的album.owner。如何在加入前过滤? (它是否有效?我会破坏索引吗?)

1 个答案:

答案 0 :(得分:2)

对于此查询:

SELECT a.id, a.name, count(p.album_id)
FROM album a LEFT JOIN
     pictures p
    ON p.album_id = a.id
WHERE a.owner = ?
GROUP BY a.id;

您需要album(owner, id, name)上的索引。这可以加快您的查询速度。

然而,如果用这样的措辞,它可能会更快:

SELECT a.id, a.name,
       (SELECT count(*)
        FROM pictures p
        WHERE p.album_id = a.id
       )
FROM album a 
WHERE a.owner = ?

在这里,您需要上述索引和pictures(album_id)上的索引。