【联表查询中的隐蔽 bug】
join、left join
- JOIN(INNER JOIN)是选择两个表中都有的记录,结果集会排除掉任何不匹配的记录。
- LEFT JOIN是选择左表的所有记录,右表的记录如果存在则包括在内,不存在则用NULL填充。
举例
前提介绍
- 下面的sq大致看上去好像没问题。
- 有三张表 (users用户表、orders订单表、order_user用户和订单的关联表表示参加这个订单的用户) 。
- 很明显,这个sql对应的需求应该是查询所有订单,并且联表查询出参加这个订单的用户,也就是及时这个订单没有用户参与也要将这条订单查出。
- 但是,现在情况是当order_user没有记录与orders对应时,这条订单不能被查出。
select orders.id AS order_id,
// ... 省略一些字段
orders.description AS order_description,
users.id AS user_id,
// ... 省略一些字段
users.description AS user_description
from orders
join order_user on orders.id = order_user.order_id
left join users on users.id = order_user.user_id
where orders.is_delete = 0
and order_user.is_delete = 0
and users.is_delete = 0;
问题分析
上面的sql问题出在where后面的条件上,虽然left join不会管右边有没有用户相匹配,但是,where后面的isdelete=0会过滤掉右边为空的记录。
解决办法
将isdelete判断变成联表查询的并列条件。
select orders.id AS order_id,
// ... 省略一些字段
orders.description AS order_description,
users.id AS user_id,
// ... 省略一些字段
users.description AS user_description
from orders
left join order_user on orders.id = order_user.order_id and order_user.is_delete = 0
left join users on users.id = order_user.user_id and users.is_delete = 0
where orders.is_delete = 0;
原文地址:https://blog.csdn.net/qq_53674101/article/details/144025030
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!