MySQL根据不同条件联查不同表的数据if/case

MySQL根据不同条件联查不同表的数据

项目开发中遇到类似的需求。Mybatis 中的< if >标签只能判断where部分,不能满足要求。在网上查解决方法,好像并没有可以完美解决问题的方案,if和case可以从某一种角度实现效果。

if

MySQL中if的用法
IF(expr1,expr2,expr3)
类似三元运算符,判断expr1,如果 expr1 是TRUE,则该语句的返回值为expr2; 否则返回值为 expr3。

SELECT product_id, 
IF(product_type_id=1, (SELECT COUNT(*) FROM `device` WHERE product_id = product.product_id),
					  (SELECT COUNT(*) FROM `monitor`WHERE product_id = product.product_id)) as device_num
FROM `product`
WHERE product_id in (1,25)

查product_id为(1,25)两产品的设备数。product表中字段product_type_id表示产品类型。如果是1就查device表,否则就查monitor表。
在这里插入图片描述

case

多于两种情况时
case的用法
CASE expr1 WHEN a THEN A WHEN … THEN … ELSE … END
判断expr1,满足不同条件时执行不同的语句。

注:最后以END结尾

SELECT product_id,
CASE product_type_id 
WHEN 1 THEN (SELECT COUNT(*) FROM `device` WHERE product_id = product.product_id)
WHEN 2 THEN (SELECT COUNT(*) FROM `monitor`WHERE product_id = product.product_id)
	   ELSE (SELECT COUNT(*) FROM `other_device`WHERE product_id = product.product_id) END as device_num
FROM `product`
WHERE product_id in (1,11,25)

在这里插入图片描述

最后

这样能勉强实现效果,但并不是想象的那种。话说,这种情况是不是应该先查出共同的部分,再在service层进行判断,执行不同的语句。。

### 基于 SSM 框架的女装商城项目概述 SSM框架指的是Spring、Spring MVC 和 MyBatis 的组合,在开发Web应用方面具有高效性和灵活性。对于构建女装商城项目而言,此架构能够很好地支持业务逻辑处理、数据持久化以及前端交互。 #### 项目结构设计 典型的基于SSM框架的电商项目的目录结构如下所示: ``` src/ ├── main/ │ ├── java/ # Java源文件位置 │ │ └── com.example.womenfashion/ │ │ ├── controller/ # 控制器层实现类存放处 │ │ ├── service/ # 服务接口定义和服务实现类所在路径 │ │ └── dao/ # 数据访问对象(DAO),即MyBatis映射文件对应的Java Bean │ ├── resources/ # 配置文件夹 │ │ ├── mapper.xml # SQL语句配置文件 │ │ ├── applicationContext.xml # Spring核心配置文件 │ │ └── spring-mvc.xml # Spring MVC扩展名解析器等设置 └── webapp/ # Web页面资源放置区 ├── WEB-INF/views # JSP视图模板存储区域 └── static # CSS, JavaScript和其他静态资源保存在此处 ``` #### 关键技术点说明 - **依赖管理**:通过 Maven 或 Gradle 来引入必要的库和工具包[^1]。 - **数据库连接池**:采用 Druid 连接池来优化数据库操作性能并提高安全性[^2]。 - **事务控制**:利用 @Transactional 注解简化复杂的多联查场景下的事物提交回滚机制[^3]。 - **分页查询功能**:借助 PageHelper 插件轻松完成商品列展示时的数据分页需求[^4]。 ```xml <!-- pom.xml 中的部分内容 --> <dependencies> <!-- 添加springmvc,spring-data-jpa等相关jar包 --> </dependencies> <!-- application.properties 文件中的部分属性 --> spring.datasource.type=com.alibaba.druid.pool.DruidDataSource mybatis.configuration.map-underscore-to-camel-case=true pagehelper.helperDialect=mysql ``` #### 用户登录注册模块实例代码片段 以下是关于用户登录验证的一个简单例子,展示了如何结合前后端进行身份认证流程的设计。 ```java // UserController.java (控制器) @RequestMapping("/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password){ User user = userService.findByUsernameAndPassword(username,password); if(user != null && BCrypt.checkpw(password,user.getPassword())){ session.setAttribute("currentUser",user); // 将当前登陆者的信息存入session中 return "redirect:/index"; }else{ model.addAttribute("error","用户名或密码错误"); return "/login"; } } ``` ```sql -- users 创建脚本 CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', `username` varchar(50) DEFAULT '' COMMENT '账号名称', `password` char(60) DEFAULT '' COMMENT '加密后的密码字符串', PRIMARY KEY (`id`), UNIQUE KEY `idx_username_unique` (`username`) ) ENGINE=InnoDB; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值