2017-07-02 132 views
-1

我有一个查询,其中一个LEFT JOIN工作正常。然而,当我将第二个LEFT JOIN添加到第一个表中每个字段具有多个记录的表中时,我得到了两个表中的结果的产品,即书籍x发布者返回。我怎样才能防止这种情况发生?MYSQL:处理多个LEFT JOIN

SELECT a.*,b.*,p.*, group_concat(b.id as `bids`) 
    FROM authors `a` 
    LEFT JOIN books `b` 
    ON b.authorid = a.id 
    LEFT JOIN publishers `p` 
    on p.authorid = a.id 
    GROUP by a.id 

编辑:

想通了。做到这一点的方法是使用子查询作为this answer

SELECT u.id 
    , u.account_balance 
    , g.grocery_visits 
    , f.fishmarket_visits 
FROM users u 
LEFT JOIN (
    SELECT user_id, count(*) AS grocery_visits 
    FROM grocery 
    GROUP BY user_id 
    ) g ON g.user_id = u.id 
LEFT JOIN (
    SELECT user_id, count(*) AS fishmarket_visits 
    FROM fishmarket 
    GROUP BY user_id 
    ) f ON f.user_id = u.id 
ORDER BY u.id; 
+2

更新您的问题添加一个正确的数据示例和预期结果 – scaisEdge

+0

我更新了问题...任何想法? – user6631314

+0

您的问题不清楚...请添加适当的数据样本和预期的结果.. – scaisEdge

回答

0

如果你做多的LEFT加入,你的查询将返回结果的笛卡尔乘积。为了避免这种情况并只获得你需要的字段的副本,请为你想要加入的每个表做一个子查询,如下所示。希望这有助于未来的人。

SELECT u.id 
    , u.account_balance 
    , g.grocery_visits 
    , f.fishmarket_visits 
FROM users u 
LEFT JOIN (
    SELECT user_id, count(*) AS grocery_visits 
    FROM grocery 
    GROUP BY user_id 
    ) g ON g.user_id = u.id 
LEFT JOIN (
    SELECT user_id, count(*) AS fishmarket_visits 
    FROM fishmarket 
    GROUP BY user_id 
    ) f ON f.user_id = u.id 
ORDER BY u.id;