【联表查询中的隐蔽 bug】

join、left join

  • JOIN(INNER JOIN)是选择两个表中都有的记录,结果集会排除掉任何不匹配的记录。
  • LEFT JOIN是选择左表的所有记录,右表的记录如果存在则包括在内,不存在则用NULL填充。

举例

前提介绍

  • 下面的sq大致看上去好像没问题。
  • 有三张表 (users用户表、orders订单表、order_user用户和订单的关联表表示参加这个订单的用户) 。
  • 很明显,这个sql对应的需求应该是查询所有订单,并且联表查询出参加这个订单的用户,也就是及时这个订单没有用户参与也要将这条订单查出。
  • 但是,现在情况是当order_user没有记录与orders对应时,这条订单不能被查出。
sql 复制代码
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判断变成联表查询的并列条件。

sql 复制代码
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;
相关推荐
DCTANT36 分钟前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
程序员岳焱2 小时前
Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
后端·mysql·性能优化
喜欢敲代码的程序员3 小时前
SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:项目搭建(一)
spring boot·mysql·elementui·vue·mybatis
AI、少年郎3 小时前
Oracle 进阶语法实战:从多维分析到数据清洗的深度应用(第四课)
数据库·oracle
赤橙红的黄3 小时前
自定义线程池-实现任务0丢失的处理策略
数据库·spring
钢铁男儿3 小时前
C# 委托(调用带引用参数的委托)
java·mysql·c#
叁沐3 小时前
MySQL 02 日志系统:一条SQL更新语句是如何执行的?
mysql
DataGear3 小时前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化
weixin_438335403 小时前
分布式锁实现方式:基于Redis的分布式锁实现(Spring Boot + Redis)
数据库·redis·分布式
RunsenLIu3 小时前
基于Vue.js + Node.js + MySQL实现的图书销售管理系统
vue.js·mysql·node.js