left join on多表关联内嵌关联
left join是一种多表关联查询方式,它可以将两个或多个表中的数据进行关联查询,同时保留左表中的所有数据。on是left join的一个子句,用于指定关联条件。内嵌关联是指在一个表中嵌套另一个表的查询,以实现多表关联查询的目的。下面是一个left join on多表关联内嵌关联的示例:
假设我们有两个表,一个是学生表,一个是成绩表。学生表中包含学生的基本信息,成绩表中包含学生的各科成绩。我们需要查询每个学生的基本信息以及他们的数学成绩。
SELECT s.name, s.age, g.math_score
FROM student s
LEFT JOIN (
SELECT *
FROM grade
WHERE subject = 'math'
) g ON s.id = g.student_id;
上面的查询语句中,我们使用了left join将学生表和成绩表进行关联查询,并使用on子句指定了关联条件。同时,我们使用了内嵌关联,将成绩表中的数学成绩查询出来。最终的查询结果包含每个学生的基本信息以及他们的数学成绩(如果有的话)。
mybatisplus inner join
MyBatis Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
在使用 MyBatis Plus 进行 INNER JOIN
操作时,并不会直接提供像其他 ORM 工具那样通过 API 调用就可以完成复杂连接查询的功能。通常需要借助原生 SQL 或者 XML 映射文件来进行复杂的联表操作。
使用 XML 实现 INNER JOIN
例如有两个实体类:用户(User)和订单(Order),并且想从数据库中获取每个用户的最近一次下单信息:
<!-- UserMapper.xml -->
<select id="getUserWithLatestOrderByUserId" resultType="java.util.Map">
SELECT u.*, o.order_id, o.order_time
FROM user u
INNER JOIN (
SELECT order_id, user_id, MAX(order_time) as maxTime
FROM orders
GROUP BY user_id
) latest_o ON u.id = latest_o.user_id
LEFT JOIN orders o ON latest_o.user_id = o.user_id AND latest_o.maxTime = o.order_time
</select>
这里我们构建了一个内嵌查询先找出每位用户的最新订单时间,再利用这个结果去做左外链接以保留所有用户记录,即便他们没有任何关联订单也可以显示出来。(注意这里的返回类型设置为了Map)
如果想要更优雅地映射成 Java 对象而不是 Map ,则需自定义 ResultMap 来指定字段到属性之间的对应关系。
另外一种常见做法是在 Service 层组合多次单表查询的结果集来达到类似的效果,但这取决于具体业务场景是否适合这样做以及性能考量等因素。
当然还有更为推荐的方式就是采用 MP 提供的 Wrapper 包装条件构造器结合 PageHelper 等分页插件,但在涉及到跨表操作尤其是涉及到了解耦设计的情况下,编写手写的 SQL 可能是最直观也最有效的解决方案了。
不过需要注意的是,在实际项目开发过程中应该尽量避免过度依赖复杂的联合查询,因为这可能会导致维护成本增加及潜在性能问题。对于一些简单的关系型数据检索任务来说,可以考虑让前端页面发起两次请求分别加载主次两张表格的数据并自行组装展示;而对于真正必要的连表操作,则应仔细评估其必要性和优化空间。
相关推荐








