如何有效地联接3个表M:N

| 我有几张桌子: 应用:
id | name | url_key
===================
1  | Hello World | hello-world
2  | Snake 2 | snake-2
开发人员:
id | name | url_key
===================
1  | Mr. Robinson | mr-robinson
2  | Richard | richard
3  | Nokia | nokia
应用程序开发人员分配
app_id | developer_id
=====================
1      | 1
1      | 2
2      | 3
因此,如您所见,一个应用程序可能具有多个开发人员。 我真正需要的是编写PostgreSQL查询以选择所有应用程序,以及有关相关开发人员的一些有用信息。 例如像这样:
Hello World | 1-hello-world | Mr.Robinson<1-mr-robinson> /and 1 more/
Snake 2     | 2-snake-2     | Nokia<3-nokia>
因此,如果应用程序有一个开发人员,只需将开发人员的名称,URL键和ID附加到应用程序中;如果应用程序中有更多开发人员,请附加第一个并附加“有多少开发人员”的信息。 最重要的是-我最终需要过滤结果(例如,不要从某些指定的开发人员处退回应用程序)。 我知道可以通过为应用程序本身编写第一个查询,然后每行发送下一个查询来解决,但是我认为这不是很好的方法... 如果我只是简单地加入表:
SELECT * FROM apps a
LEFT JOIN apps_developers_assignment ada ON a.id = ada.app_id
LEFT JOIN developers d ON ada.developer_id = d.id

Hello World | 1-hello-world | Mr.Robinson<1-mr-robinson>
Hello World | 1-hello-world | Richard<2-richard>
Snake 2     | 2-snake-2     | Nokia<3-nokia>
它返回重复的应用程序...,我不知道如何通过开发人员筛选这些结果(如我上面所述)。     
已邀请:
假设您只想筛选出一名开发人员,则需要传递一个参数。为此,我正在调用此参数/变量@excludeDevId。 我对T-SQL更为熟悉,因此这可能/将也需要Postgres中的等效语法。另外,由于左连接的结果,我将空值保留为空值-从您的输出中可能要合并到COALESCE(可能还会进行其他一些输出调整)。这是袖手旁观,未经测试,但至少足以使您朝正确的方向前进:
SELECT 
    a.name AppName, 
    a.id AppId,
    d.id DevId,
    d.url_key Url,
    d.name DevName,
    CAST(agg.dev_count - 1 as VARCHAR) + \' more\'
FROM 
    (
    SELECT 
        MAX(ada.developer_id) first_dev_id, 
        COUNT(ada.developer_id) dev_count, 
        app_id
    FROM
        apps_developers_assignment ada 
    WHERE 
        d.id != @excludeDevId
    GROUP BY
        app_id
    ) agg
    INNER JOIN apps a ON a.id = agg.app_id
    LEFT JOIN developers d ON agg.developer_id = d.id
    
如果要使用左联接,则需要将条件放在该联接上,否则它将创建一个内部联接,并且不会返回其中包含null的行……请尝试类似这个:
SELECT * FROM apps a
LEFT JOIN apps_developers_assignment ada ON a.id = ada.app_id
                                            AND ada.developerid = :devid

LEFT JOIN developers d ON ada.developer_id = d.id

WHERE a.id = :appid
    

要回复问题请先登录注册