MySQL如何使用仅用于计数的where子句计算左联接?

Posted

技术标签:

【中文标题】MySQL如何使用仅用于计数的where子句计算左联接?【英文标题】:MySQL how to count in a left join with where clause only for count? 【发布时间】:2017-02-06 03:59:25 【问题描述】:

我有这两张表:ritter(ritterId, ritterName)quest(questID, ritterID, datum)

现在我的问题是,如何通过额外的一列显示 ritter 的所有内容,该列显示 ritter 在本周的任务数?

我试过这个:

select r.*, count(q.ritterID) from ritter as r left join quest as q on r.ritterID = q.ritterID group by r.ritterID;

这可行,但没有本周的 where 原因。

如果我这样做:select r.*, count(q.ritterID) from ritter as r left join quest as q on r.ritterID = q.ritterID where weekofyear(datum) = weekofyear(now()) group by r.ritterID;

然后它只显示在本周完成任务的 ritter,但我希望它显示所有 ritter。

输出:

怎么样:

应该如何:

表 ritter:

还有餐桌任务:

我该如何解决这个问题?

我希望你能明白我的意思和我想要的。对不起我的英语。

【问题讨论】:

我犯了一个错误。它应该在“ritterID”列的“quest”表中为“1”。 【参考方案1】:

您必须在左连接中包含日期条件。

select r.*, count(q.ritterID) 
from ritter as r 
left join quest as q on r.ritterID = q.ritterID 
    AND weekofyear(datum) = weekofyear(now()) 
group by r.ritterID;

【讨论】:

【参考方案2】:

您离解决方案不远了,只需将日期过滤器从 where 条件移到连接条件中即可。这样它只适用于连接右侧的表,而不是整个结果集:

select r.*, count(q.ritterID)
from ritter as r left join quest as q
   on r.ritterID = q.ritterID and weekofyear(datum) = weekofyear(now())
group by r.ritterID

由于 ritter 名称在功能上取决于 ritter id,因此您的查询在最新版本的 mysql 上会很好。但是,在旧版本中,如果设置了only_full_group_by sql 模式,您可能会遇到麻烦。因此,将 r.ritterName 添加到 group by 子句可能会更好。

【讨论】:

以上是关于MySQL如何使用仅用于计数的where子句计算左联接?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 的 WHERE 子句中使用计算字段?

左连接的where子句中的Mysql查询错误

MySQL UDF 仅适用于 `IF` 中的 `WHERE` 子句

与 where 子句不工作的左连接

如何编写一个同时适用于 HSQLDB 和 MySQL 的查询以在 WHERE 子句中为日期添加天数?

MySQL where 子句是线性的。如何优化