左连接使查询混乱

问题描述 投票:0回答:3

我对此查询有一些麻烦,它没有返回应有的所有行:

SELECT DE.user_id, 
       DE.id, 
       DE.title, 
       DE.limit_new_cards, 
       DE.limit_old_cards, 
       DE.deleted, 
       Count(DISTINCT TCA.id) total_cards, 
       Count(DISTINCT NCA.id) new_cards, 
       Count(DISTINCT OCA.id) due_cards 
FROM   decks AS DE 
       LEFT JOIN cards AS TCA 
              ON TCA.deck_id = DE.id 
       LEFT JOIN cards AS NCA 
              ON NCA.deck_id = DE.id 
                 AND NCA.is_new = 1 
       LEFT JOIN cards AS OCA 
              ON OCA.deck_id = DE.id 
                 AND OCA.due_date <= CURRENT_DATE() 
WHERE  DE.user_id = 47 
GROUP  BY TCA.deck_id 
ORDER  BY DE.id;

是否应返回与此查询相同的行数?是否?

SELECT user_id, 
       id, 
       title, 
       limit_new_cards, 
       limit_old_cards, 
       deleted, 
FROM   decks 
WHERE  user_id = 47 
ORDER  BY id; 

如果有人能帮助我,我会很高兴。

mysql sql join group-by left-join
3个回答
1
投票

我怀疑问题出在您的GROUP BY子句:

GROUP BY TCA.deck_id 

应该是:

GROUP BY DE.id 

比率:TCA是具有以下条件的LEFT JOIN ed表:

ON TCA.deck_id = DE.id 

[TCA中没有匹配项时,TCA.deck_idNULL,然后为GROUP BY。因此,您最终将在DE.id中没有匹配项的所有TCA分组在一起。相反,您应该使用基础表DE中的相应列-可能永远不会NULL


0
投票

具有左联接的查询应仅在其他表中具有这些值并且所有这些值都为true时,才返回相同数量的行。

       LEFT JOIN cards AS TCA 
              ON TCA.deck_id = DE.id 
       LEFT JOIN cards AS NCA 
              ON NCA.deck_id = DE.id 
                 AND NCA.is_new = 1 
       LEFT JOIN cards AS OCA 
              ON OCA.deck_id = DE.id 
                 AND OCA.due_date <= CURRENT_DATE() 

如果不是,则仅返回这些条件为真且表中存在数据的行,这就是LEFT连接的工作方式


0
投票

第一和第二查询将返回相同数量的行。因为,您使用了LEFT JOIN。那么,您到底想要什么?

© www.soinside.com 2019 - 2024. All rights reserved.