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

 更新时间:2023年05月31日 10:17:56   作者: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需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql中的limit用法有哪些(推荐)

    mysql中的limit用法有哪些(推荐)

    在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢,mysql已经为我们提供了这样一个功能,尽管语法逻辑很是怪异,这个功能就好比oracle里的rownum,但比mysql提供的这个LIMIT好用、好记和好理解多了,具体内容一起通过本文看看吧
    2017-10-10
  • mysql导入sql文件常用的方法及适用场景

    mysql导入sql文件常用的方法及适用场景

    在日常学习和工作,难免不了使用Mysql数据库,有时候需要导入导出数据库,或者其中的数据表,这篇文章主要介绍了mysql导入sql文件常用的方法及适用场景,需要的朋友可以参考下
    2025-08-08
  • Node-Red实现MySQL数据库连接的方法

    Node-Red实现MySQL数据库连接的方法

    这篇文章主要介绍了Node-Red实现MySQL数据库连接的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • linux系统中mysql数据库的导入和导出

    linux系统中mysql数据库的导入和导出

    本文给大家简单记录了一下在linux系统中mysql数据库的导入和导出的方法,有相同需求的小伙伴可以参考下
    2016-02-02
  • mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法

    mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法

    这篇文章主要介绍了mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法,需要的朋友可以参考下
    2014-12-12
  • MySQL内连接和外连接及七种SQL JOINS的实现

    MySQL内连接和外连接及七种SQL JOINS的实现

    这篇文章主要介绍了Mysql内连接和外连接的区别以及七种SQL Joins的实现,相信看完这篇文章你对SQL内外连接的多表查询就足够理解了,需要的朋友可以参考下
    2023-03-03
  • PostgreSQL 正则表达式 常用函数的总结

    PostgreSQL 正则表达式 常用函数的总结

    这篇文章主要介绍了PostgreSQL 正则表达式 常用函数的总结的相关资料,对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具,这里就介绍下如何使用,需要的朋友可以参考下
    2017-08-08
  • MySQL中REPLACE INTO和INSERT INTO的区别分析

    MySQL中REPLACE INTO和INSERT INTO的区别分析

    REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。
    2011-07-07
  • MySQL数据库忽略大小写的配置方法

    MySQL数据库忽略大小写的配置方法

    这篇文章主要给大家介绍了MySQL数据库忽略大小写的配置方法,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • 修改MySQL的默认密码的四种小方法

    修改MySQL的默认密码的四种小方法

    对于windows平台来说安装完MySQL后,系统就已经默认生成了许可表和账户,下文中就教给大家如何修改MySQ的默认密码。
    2015-09-09

最新评论