SQL左联接表在左联接表上

时间:2019-05-19 12:26:48

标签: mysql sql

我目前正尝试在左联接表上左联接表,如下所示。 我有桌子:

  • 帐户(id,vorname,nachname)
  • projektkurse(id,accounts_id,projektwochen_id)
  • projektkurs_einzel(id,projektkurse_id)
  • projektkurs_einzel_zeiten(ID,日期,班次,projektkurs_einzel_id)

现在,我想获取每个帐户及其在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的帐户?

2 个答案:

答案 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