MySQL如何根据不同条件联查不同表的数据if/case
作者:Coo~ 发布时间:2024-01-21 14:20:10
标签: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层进行判断,执行不同的语句。。
MySQL两表联查,根据不同条件获得不同数据
场景:
查找某张表中某一列的所有符合某种条件的条目的累加和,且该表和另一张表相关联
查询语句
select DISTINCT ??
ifnull((select sum(‘列名') from a, b where a.id = b.id and a.condition=condition1 and b.condition = condition2),0) as '条件1下的数据' ,
ifnull((select sum(‘列名') from a, b where a.id = b.id and a.condition=condition3 and b.condition = condition4),0) as '条件2下的数据'
from a, b where a.id = b.id?
缺点:数据量一太大就会be崩溃
优化后语句
select ‘别名1', ‘别名2'
from?
(select IFNULL(sum(‘列名'),0) ‘别名1' from a, b where a.id = b.id and a.condition=condition1 and b.condition = condition2),0) t1
left join?
(select IFNULL(sum(‘列名'),0) ‘别名2' from a, b where a.id = b.id and a.condition=condition3 and b.condition = condition4) t2 on 1=1
left join查询比select嵌套查询效率高的原因:执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。
来源:https://blog.csdn.net/qq_28869233/article/details/103305802


猜你喜欢
- 前言目前,Golang 可以认为是服务器开发语言发展的趋势之一,特别是在流媒体服务器开发中,已经占有一席之地。很多音视频技术服务提供商也大多
- 当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验、净化和转换时,将会面临很大
- 前面的话在介绍Date对象之前,首先要先了解关于日期和时间的一些知识。比如,闰年、UTC等等。深入了解这些,有助于更好地理解javascri
- 1.使用Docker安装Elasticsearch及其扩展获取镜像,可以通过网络pullsudo docker image pull del
- Macromedia StandardMacromedia Dreamweaver MXMenu Commandsphotoshop快捷键大
- 0. 前言无论在工作中,还是学习中,都会出现这样子的需求,对某张表进行了排序(按时间排序也好,其他字段排序也罢),然后获取前x行的数据,由于
- 我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中。特殊食物:1.绿色:普通,
- 如何在线修改表?具体代码如下:<%Set conn1 = Server.CreateObject(&qu
- 这两天终于忍不住的去实验了一下,为什么网页的字体有时会显示成超级无敌难看的宋体呢?其实宋体不难看,难看的只是把它放在Leopard下,没有点
- 本文实例讲述了php mailer类调用远程SMTP服务器发送邮件实现方法。分享给大家供大家参考,具体如下:php mailer 是一款很好
- 一、若出现404错误,自动跳转到所在目录的首页;二、若当前页本身是目录首页,则自动跳转至上一级目录的默认首页。自定义404页面代码如下:&l
- 前言上一篇博客我们知道的Mysql事务的隔离机制和实现,以及锁的详细解析链接: MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LB
- 在ASP中加密方法有对应的解密方法好象不多,现在根据前辈资料整理出在asp中加密与解密函数,根据RSA 算法实现的。什么是RSA?
- 如下所示:def softmax(logits, axis=None, name=None, dim=None): ""
- 前言在用python处理表格数据中,这其中的工作重点就是对表格类型的数据进行梳理、计算和展示,本文重点介绍展示这个方面的工作。首先我们看一个
- 每种语言都有自己的独到之处,或奇特的语法,或不常见的函数,或非标准的执行方式。因此,不论新丁还是老手,看着某个特性会突然醉了。文中总结了10
- 此文仅当学习笔记用.这个实例是在Python环境下如何爬取弹出窗口的内容,有些时候我们要在页面中通过点击,然后在弹出窗口中才有我们要的信息,
- 边缘检测一般是识别目标图像中亮度变化明显的像素点. 因为显著变化的像素点通常反映了图像变化比较重要的地方.1. Canny 边缘检测理论Ca
- 什么是事务? 事务是逻辑上的一组操作,组成这组操作的各个单元,要不全都成功要不全都失败,这个特性就是事务 注意:mysql数据支持事务,但是
- 1、按位取反bitwise_not()按位取反就是将数值根据每个bit位1变0,0变1,比如0xf0按位取反就变成了0x0f,如果是uint