基于联表模糊查询的SQL

测试表b

if exists (select * from sysobjects where id = OBJECT_ID('[b]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) DROP TABLE [b]
CREATE TABLE [b] ( [b1] [varchar] (50) NULL , [b2] [varchar] (50) NULL )。

INSERT [b] ( [b1] , [b2] ) VALUES ( '1' , '112' )
INSERT [b] ( [b1] , [b2] ) VALUES ( '2' , '11' )

测试表a

ssssss
sssss

if exists (select * from sysobjects where id = OBJECT_ID('[a]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) DROP TABLE [a]
CREATE TABLE [a] ( [a1] [varchar] (50) NOT NULL , [a2] [varchar] (50) NOT NULL )

INSERT [a] ( [a1] , [a2] ) VALUES ( '1' , '11' )
INSERT [a] ( [a1] , [a2] ) VALUES ( '2' , '1122' )
INSERT [a] ( [a1] , [a2] ) VALUES ( '3' , '1122' )
INSERT [a] ( [a1] , [a2] ) VALUES ( '4' , '112' )
INSERT [a] ( [a1] , [a2] ) VALUES ( '5' , '111' )

要写sql解决的问题是:

求b表中的字段b2,在a表中的字段a2中模糊匹配的个数.注意:需要最长匹配!也就是a表中的a2字段1122,统计时只能放在112中,而不能算做11的统计个数:或选取的数据如下:

11,11

11,111

112,1122

112,1122

112,112

也即:

11:共两条,112共三条

### 使用 MyBatis-Plus 的 `@Select` 注解实现连查询 MyBatis-Plus 是一种强大的持久化框架,它简化了数据库操作并提供了灵活的 SQL 构造方式。通过 `@Select` 注解可以直接定义复杂的 SQL 查询逻辑,包括查询。 以下是基于提供的引用内容以及 MyBatis-Plus 官方文档的知识构建的一个具体例子: #### 示例代码 假设存在两个:`table1` 和 `table2`,它们之间有一对多的关系(即 `table1.id` 对应于 `table2.table1_id`)。可以通过如下方式进行查询: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; public interface TableMapper { @Select("SELECT a.id AS table1_id, a.name AS table1_name, b.age AS table2_age " + "FROM table1 ${ew.tablesAlias('a')} " + "INNER JOIN table2 ${ew.tablesAlias('b')} ON a.id = b.table1_id " + "${ew.whereSql()} " + "ORDER BY ${ew.orderByColumns()} " + "LIMIT ${ew.limit()}") List<Object> getJoinList(@Param(Constants.WRAPPER) QueryWrapper<?> ew); } ``` 上述代码实现了以下几个功能: - **动态 SQL**:利用 `${ew}` 动态替换子句来支持条件过滤、分页等功能[^1]。 - **别名管理**:通过 `${ew.tablesAlias('aliasName')}` 方法为指定别名。 - **字段映射**:在 SELECT 子句中显式指定了返回列及其对应的别名。 #### 参数说明 - `QueryWrapper<?> ew`: 这是一个通用的封装对象,用于传递动态 SQL 条件参数。 - `${ew.*}`: 达式的占位符会根据传入的实际值被解析成具体的 SQL 片段。 --- 如果需要进一步增强灵活性,比如针对特定字段使用模糊匹配而非默认的精确匹配,则可以借助 `@TableField` 注解完成定制化的字段行为配置[^2]。例如,在实体类中声明某个字段采用 LIKE 方式进行拼接: ```java @Data public class User { private Long id; @TableField(condition = SqlCondition.LIKE) private String name; private Integer age; private String email; private Long managerId; private LocalDateTime createTime; } ``` 这样当此字段参与 WHERE 条件时,默认生成的是类似于 `"WHERE name LIKE '%value%'"` 的 SQL 语句。 --- 对于更复杂的应用场景,还可以考虑引入 Hibernate 命名查询机制作为补充方案[^3]。尽管 Hibernate 并不属于 MyBatis 生态圈的一部分,但在实际项目开发过程中两者经常互为替代品或者混合使用。因此熟悉命名查询的概念有助于理解跨框架的最佳实践模式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值