首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL多个左外连接查询问题,涉及3个表

MySQL多个左外连接查询问题,涉及3个表
EN

Stack Overflow用户
提问于 2010-08-12 16:04:29
回答 1查看 38.9K关注 0票数 10

由于0的反应,我猜我的左联接问题涉及到一个过于深奥的数据库的太多细节。我已经对这个问题进行了编程,但我仍然想知道如何加入类似的场景:

假设有一个基本的代理键策略(每个表都有一个只自动递增的id字段),以及它明显的父表的外键。所有大写中的单词都可以被认为是表格。

假设你有一个包含狗的数据库。例如:沃尔菲,温斯顿,布奇和本尼

每条狗都有跳蚤。(为了简单起见,让一只跳蚤只生活在一条狗身上,让它成为一种1到多种关系)。跳蚤有身份作为名字或其他什么,以及他们是什么颜色。

每只跳蚤会咬它的狗主人几次,这是存储在这个数据库,并记录每天。

字段id(PK),跳蚤id(FK),日期,times_bitten。

假设你想得到每条狗被咬的总次数(这很容易)

代码语言:javascript
复制
SELECT Dog.Name, sum(Bite.times_bitten)
FROM Dog, Flea, Bite
WHERE Dog.id = Flea.Dog_id and Bite.id = Flea.Bite_id
GROUP BY Dog.Name

假设您要在"WHERE“子句中添加标准,将其限制为"Brown”跳蚤,而没有"Brown“跳蚤咬过Benny。

代码语言:javascript
复制
SELECT Dog.Name, sum(Bite.times_bitten)
FROM Dog, Flea, Bite
WHERE Dog.id = Flea.Dog_id and Bite.id = Flea.Bite_id and Flea.color = "Brown"
GROUP BY Dog.Name

Benny不在结果

您将如何重写查询,以使Benny的名字仍然出现,或者是0(最好)或NULL,而不是让Benny从结果中完全删除?

这似乎是关于多个左外联接的。但是,对于这样的多个表,很容易找到的文档似乎没有回答一个问题,其中3个表的中间有一个值过滤器。

是否有人有关于如何重写它以允许多个左外部联接的建议,或者有一些其他的方法来将狗的所有名称保存在查询中,即使sum = 0?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-24 17:49:17

这应该是可行的:

代码语言:javascript
复制
SELECT Dog.Name, COALESCE(SUM(Bite.times_bitten), 0) AS times_bitten
FROM Dog
LEFT JOIN Flea
  ON Flea.Dog_id = Dog.id
    AND Flea.color = "Brown"
LEFT JOIN Bite
  ON Bite.id = Flea.Bite_id
GROUP BY Dog.Name

通过使用LEFT JOIN,您将提取所有的Dog记录,甚至那些没有相应跳蚤的记录(对于这些记录,联接中的列将为NULL)。如果没有找到记录,可以使用COALESCEtimes_bitten设置为0(否则将为NULL)。

您可能还想按Dog.id而不是Dog.Name进行分组(除非不可能有多个名称相同的狗?)

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3469643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档