Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL左联接左联接表上的表_Mysql_Sql - Fatal编程技术网

Mysql SQL左联接左联接表上的表

Mysql SQL左联接左联接表上的表,mysql,sql,Mysql,Sql,Iam当前正在尝试按如下方式在左联接的表上左联接一个表。 我有以下表格: 帐户(id、vorname、nachname) 项目编号(id、账户编号、项目编号) projektkurs_einzel(id,projektkurse_id) 项目编号、日期、班次、项目编号 现在,我想获得每个帐户以及它们在projektkurs_einzel_zeiten中的条目的次数,这也应该是唯一的。因此,多次使用相同的日期和班次不算作多个条目。结果还应受到表projektkurse中projektwoche

Iam当前正在尝试按如下方式在左联接的表上左联接一个表。 我有以下表格:

  • 帐户(id、vorname、nachname)
  • 项目编号(id、账户编号、项目编号)
  • projektkurs_einzel(id,projektkurse_id)
  • 项目编号、日期、班次、项目编号
现在,我想获得每个帐户以及它们在projektkurs_einzel_zeiten中的条目的次数,这也应该是唯一的。因此,多次使用相同的日期和班次不算作多个条目。结果还应受到表projektkurse中projektwochen_id列的限制。此列应与示例8中的某个值匹配

有些帐户在projektkurse、projektkurs_einzel和projektkurs_einzel_zeiten中没有任何条目,这就是为什么我的第一个想法是像这样使用左连接:

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;
选择accounts.id、accounts.vorname、accounts.nachname、COUNT(不同的projektkurs\u einzel\u zeiten.date、projektkurs\u einzel\u zeiten.shift)作为T
来自帐户
在accounts.id=projektkurse.creator\u id上左加入projektkurse
在projektkurse.id=projektkurs\u einzel.projektkurs\u id上左连接projektkurs\u einzel
左连接projektkurs_einzel_zeiten ON projektkurs_einzel.id=projektkurs_einzel_zeiten.projektkurs_einzel_id
其中projektkurse.projektwochen_id=8
按帐户分组。id
这个查询并不能完全实现我想要的。它只返回在projektkurse中至少有一个条目的帐户,即使它们在projektkurs_einzel和projektkurs_einzel_zeiten中没有条目。对于他们来说,计数显然是0,但是在projektkurse中没有条目的帐户将被完全忽略。
我怎样才能同时显示在任何其他表中也没有计数为0的条目的帐户?

您不应该使用eft join表的列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

我建议您这样编写查询:

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
    值不匹配
  • 表别名使查询更易于编写和读取
  • 最佳做法是将所有未聚合列包含在
    分组依据中。但是,假设
    id
    是唯一的,那么您的公式就可以了(由于所谓的“函数依赖性”)

样本数据和期望的结果将非常有用!请记住,您的查询可能无法使用,请参阅和“(并且是MySQL最新版本的默认设置所必需的)。“不完全正确,因为MySQL 5.7.5+仅支持sql_模式的功能依赖性_FULL_GROUP_设置得很好,请参阅页面“将所有未聚合的列包含在GROUP by中是最佳做法”我同意这一点,因为并非每个数据库供应商都支持SQL标准中可选的功能依赖性。。仍然+1@RaymondNijland . . . 非常感谢。我学到了一些东西。我没有意识到MySQL检测到函数依赖性。@RaymondNijland。那样的话,谢谢你的耐心。