mysql – LEFT JOIN不返回左侧表中的所有记录
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – LEFT JOIN不返回左侧表中的所有记录,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3384字,纯文字阅读大概需要5分钟。
内容图文
![mysql – LEFT JOIN不返回左侧表中的所有记录](/upload/InfoBanner/zyjiaocheng/888/be1a72b332b546aaa34ab84fa2194629.jpg)
SELECT d.mt_code,
d.dep_name,
d.service_name,
COUNT(*)
FROM DepartmentService AS d
LEFT JOIN tbl_outgoing AS t ON d.mt_code = t.depCode
WHERE d.service_type = 'MT'
AND t.smsc = "mobitelMT"
AND t.sendDate BETWEEN '2014-07-01' AND '2014-07-02'
GROUP BY d.mt_code
DepartmentService表包含有关提供服务的部门的详细信息. tbl_outgoing表包含客户完成的特定服务所发生的所有事务.在WHERE子句中,应该完成两个自助餐厅,即service_type =’MT’和smsc =“newMT”.我想得到一份报告,显示所有部门在特定时期内的交易.我使用LEFT JOIN是因为我想获得所有部门. SQL工作正常,得到我想要的结果,除了,
如果特定时间段内没有特定服务的交易,则该部门也会被忽略.我想要做的是在结果集中显示部门,并将COUNT(*)列显示为0.
我怎样才能做到这一点?
解决方法:
问题可能是您使用where条件过滤了连接表,该条件还将过滤在连接中没有匹配的部门服务,在连接中移动过滤并且仅在d处放置过滤器条款:
SELECT d.mt_code,
d.dep_name,
d.service_name,
COUNT(t.id)
FROM DepartmentService AS d
LEFT JOIN tbl_outgoing AS t
ON d.mt_code = t.depCode
AND t.smsc = "mobitelMT"
AND t.sendDate BETWEEN '2014-07-01' AND '2014-07-02'
WHERE d.service_type = 'MT'
GROUP BY d.mt_code
为了解释为什么会发生这种情况,我将向您介绍查询和我的查询所发生的情况,因为数据集我会使用它:
states
____ _________
| id | state |
| 1 | Germany |
| 2 | Italy |
| 3 | Sweden |
|____|_________|
cities
____ ________ ___________ ____________
| id | city | state_fk | population |
| 1 | Berlin | 1 | 10 |
| 2 | Milan | 2 | 5 |
|____|________|___________|____________|
首先,我将完成您的查询.
SELECT s.id, s.state, c.population, c.city
FROM states s
LEFT JOIN cities c
ON c.state_fk = s.id
WHERE c.population < 10
所以不要一步一步走,你选择三个州,左边连接城市最终:
____ _________ ____________ ________
| id | state | population | city |
| 1 | Germany | 10 | Berlin |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
您使用WHERE c.population<过滤群体. 10,此时你的左边有这个:
____ _________ ____________ ________
| id | state | population | city |
| 2 | Italy | 5 | Milan |
|____|_________|____________|________|
你松散了德国,因为柏林人口是10但是你也失去了瑞典,它有NULL,如果你想保留空值,你应该在查询中指定它:
WHERE (c.population < 10 OR IS NULL c.population)
哪个回报:
____ _________ ____________ ________
| id | state | population | city |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
现在我的查询:
SELECT s.id, s.state, c.population, c.city
FROM states s
LEFT JOIN cities c
ON c.state_fk = s.id
AND c.population < 10
在加入这两个之前,我们过滤表城市(在ON之后使用AND c.population< 10条件),剩下的是:
____ ________ ___________ ____________
| id | city | state_fk | population |
| 2 | Milan | 2 | 5 |
|____|________|___________|____________|
因为米兰是唯一一个人口不到10人的城市,现在我们可以加入这两个表:
____ _________ ____________ ________
| id | state | population | city |
| 1 | Germany | NULL | NULL |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
如您所见,左表中的数据保持不变,因为过滤条件仅应用于cities表.
结果集会根据您想要实现的目标而变化,例如,如果您希望过滤德国,因为柏林的人口数小于10而保留瑞典,您应该使用添加IS NULL条件的第一种方法,如果您想要保留它,您应该使用第二种方法并预先过滤左连接右侧的表格.
内容总结
以上是互联网集市为您收集整理的mysql – LEFT JOIN不返回左侧表中的所有记录全部内容,希望文章能够帮你解决mysql – LEFT JOIN不返回左侧表中的所有记录所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。