我目前正尝试在左联接表上左联接表,如下所示。 我有桌子:
现在,我想获取每个帐户及其在projektkurs_einzel_zeiten中具有条目的次数,该条目也应该是唯一的。因此,多次具有相同的日期和班次不算作多个条目。结果还应该受表projektkurse中的列projektwochen_id限制。此列应匹配某个值,例如8。
某些帐户在projektkurse,projektkurs_einzel和projektkurs_einzel_zeiten中没有任何条目,这就是为什么我首先想到的是使用LEFT JOIN这样的原因:
SELECT accounts.id, accounts.vorname, accounts.nachname, COUNT(DISTINCT projektkurs_einzel_zeiten.date, projektkurs_einzel_zeiten.shift) AS T
FROM accounts
LEFT JOIN projektkurse on accounts.id = projektkurse.creator_id
LEFT JOIN projektkurs_einzel on projektkurse.id = projektkurs_einzel.projektkurs_id
LEFT JOIN projektkurs_einzel_zeiten ON projektkurs_einzel.id = projektkurs_einzel_zeiten.projektkurs_einzel_id
WHERE projektkurse.projektwochen_id = 8
GROUP BY accounts.id
此查询不能完全实现我想要的。即使projektkurs_einzel和projektkurs_einzel_zeiten中没有任何条目,它只会返回在projektkurse中至少有一个条目的帐户。对于他们而言,Count显然为0,但是在projektkurse中没有条目的帐户将被完全忽略。 我还如何显示在其他表中也没有计数为0的帐户?
答案 0 :(得分:1)
我建议这样编写查询:
SELECT a.id, a.vorname, a.nachname,
COUNT(DISTINCT pez.date, pez.shift) AS T
FROM accounts a LEFT JOIN
projektkurse
ON a.id = pk.creator_id AND
pk.projektwochen_id = 8 LEFT JOIN
projektkurs_einzel pe
ON pk.id = pe.projektkurs_id LEFT JOIN
projektkurs_einzel_zeiten pez
ON pe.id = pez.projektkurs_einzel_id
GROUP BY a.id, a.vorname, a.nachname;
注意:
WHERE
条件移到ON
子句来解决您的问题。您的WHERE
将外部联接变成内部联接,因为NULL
的值不匹配。GROUP BY
中。但是,假设id
是唯一的,那么您的表述就可以了(由于所谓的“功能依赖”)。答案 1 :(得分:0)
您不应将eft联接表的列ins用作内部联接
您应在相应的ON子句中移动左连接表的where条件
SELECT accounts.id, accounts.vorname, accounts.nachname, COUNT(DISTINCT projektkurs_einzel_zeiten.date, projektkurs_einzel_zeiten.shift) AS T
FROM accounts
LEFT JOIN projektkurse on accounts.id = projektkurse.creator_id
AND projektkurse.projektwochen_id = 8
LEFT JOIN projektkurs_einzel on projektkurse.id = projektkurs_einzel.projektkurs_id
LEFT JOIN projektkurs_einzel_zeiten ON projektkurs_einzel.id = projektkurs_einzel_zeiten.projektkurs_einzel_id
GROUP BY accounts.id