MySQL如何根据不同条件联查不同表的数据if/case
作者:Coo~
这篇文章主要介绍了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需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。