我对此查询有一些麻烦,它没有返回应有的所有行:
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;
如果有人能帮助我,我会很高兴。
我怀疑问题出在您的GROUP BY
子句:
GROUP BY TCA.deck_id
应该是:
GROUP BY DE.id
比率:TCA
是具有以下条件的LEFT JOIN
ed表:
ON TCA.deck_id = DE.id
[TCA
中没有匹配项时,TCA.deck_id
为NULL
,然后为GROUP BY
。因此,您最终将在DE.id
中没有匹配项的所有TCA
分组在一起。相反,您应该使用基础表DE
中的相应列-可能永远不会NULL
。
具有左联接的查询应仅在其他表中具有这些值并且所有这些值都为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连接的工作方式
第一和第二查询将返回相同数量的行。因为,您使用了LEFT JOIN。那么,您到底想要什么?