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 UDF 仅适用于 `IF` 中的 `WHERE` 子句