文档章节

SQL --分支取数据

求是科技
 求是科技
发布于 2015/10/19 17:14
字数 341
阅读 71
收藏 0

需求分析

1.写一条SQL语句,返回一个list,list中存放的对象有个属性是type(有三种情况),需求:根据这个type关联不同的表。

常规思路

先写SQL取到这个list,在判断list中每个对象的type,再根据不同的type再去数据库表里查询一次。

常规思路弊端

如果返回的是一个对象,这样分步做是没有问题的;但是这个地方返回的是一个list,在外层的list里面套个循环来判断每个对象的type,在根据type不同,分别去联合不同的表查数据,这种想法很明显的不是最佳方案,假设list的数据成千上百条,

在套个for循环,查询时间可想可知。

解决思路

mysql里面的case when

示例如下

SELECT
    tm.LINK_CONTENT_ID,
    tm.LINK_CONTENT_TYPE,
    tm.SEND_USER_ID,
    tui.USER_IMG,
    tui.NICKNAME,
    tm.ADD_TIME,
    tm.LINK_OBJ_ID,
    tm.LINK_OBJ_IMG,
    tm.LINK_OBJ_NAME,
    tm.MESSAGE_CONTENT,
    tm.RECEIVE_USER_ID,
    tm.SUPER_CMMT_ID,
    tm.SUPER_CMMT_CONTENT,
    tm.ROOT_CMMT_ID,
    tm.READ_FLAG,
    CASE
WHEN LINK_CONTENT_TYPE = '01' THEN
    (
        SELECT
            CONCAT(
                (
                    SELECT
                        t_person.COMPANY
                    FROM
                        t_person
                    WHERE
                        t_person.PERSON_ID = tm.LINK_OBJ_ID
                ),
                '||',
                (
                    SELECT
                        CONCAT(
                            (
                                SELECT
                                    t_person.JOB_POSITION
                                FROM
                                    t_person
                                WHERE
                                    t_person.PERSON_ID = tm.LINK_OBJ_ID
                            )
                        )
                )
            )
        FROM
            t_person
        WHERE
            t_person.PERSON_ID = tm.LINK_OBJ_ID
    )
WHEN LINK_CONTENT_TYPE = '02' THEN
    (
        SELECT
            t_hr.MOTTO
        FROM
            t_hr
        WHERE
            t_hr.HR_ID = tm.LINK_OBJ_ID
    )
WHEN LINK_CONTENT_TYPE = '03' THEN
    (
        SELECT
            t_enterprise.ENTERPRISE_SUMMARY
        FROM
            t_enterprise
        WHERE
            t_enterprise.ENTERPRISE_ID = tm.LINK_OBJ_ID
    )
ELSE
    ''
END AS linkObjInfo
FROM
    t_message tm,
    t_user_info tui
WHERE
    tm.SEND_USER_ID = tui.USER_ID
AND tm.RECEIVE_USE_FLAG = 0
AND tm.RECEIVE_USER_ID = 1000000001
AND tm.SEND_USER_ID != 1000000001
AND LINK_CONTENT_TYPE IN ('01', '02', '03')
ORDER BY
    tm.ADD_TIME DESC
LIMIT 20


© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 91
博文 444
码字总数 228569
作品 0
成都
后端工程师
私信 提问
个人人民币定期存款-存本取息Personal CNY Time Deposit – Schedule

存本取息定期储蓄是指个人将属于其所有的人民币一次性存入较大的金额,分次支取利息,到期支取本金的一种定期储蓄。Scheduled Interest Withdrawal is a kind of fixed savings deposit; the...

guanji1989
2014/03/10
0
0
springboot(五):spring data jpa的使用

在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spring data jpa 开发时,发现国...

ityouknow
2016/09/28
0
0
SQL Server 2005基础知识整理

ACID:指数据库事务正确执行的四个基本要素缩写:1.原子性2.一致性3.隔离性4.持久性 2.数据库对象:表(table) 视图(view) 存储过程(stored procedure) 函数(function)索引(index) ...

IceRainYWC
2012/09/12
0
1
Mycat分表分库怎么分?Mysql DBA学习

Mycat分表分库虽然能解决大表对数据库系统的压力,但也有一些不利,因此Mycat分表分库要先解决的问题是,分不分库,分哪些库,什么规则分,分多少分片。那么究竟是怎么分的呢? 1、能不分就不...

mo默瑶
2018/05/31
0
0
Mysql数据库开发之mycat分表分库如何做?

Mycat分表分库虽然能解决大表对数据库系统的压力,但也有一些不利,因此Mycat分表分库要先解决的问题是,分不分库,分哪些库,什么规则分,分多少分片。那么究竟是怎么分的呢? 1、能不分就不...

老男孩Linux培训
2018/05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Quartz监听器Listerner

概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知。Quartz监听器主要有JobListener、TriggerListener、SchedulerListener三种,顾名思义,分别表示任务、...

大笨象会跳舞吧
16分钟前
0
0
Call exception, tries=10, retries=35, started=38348 ms ago, cancelled=false, msg=pc-node1 row

写hbase的问题,2019-01-18 23:23:28,082 | INFO | [hconnection-0x6431d54d-shared--pool2-t5] | Call exception, tries=10, retries=35, started=38348 ms ago, cancelled=false, msg=p......

stys35
19分钟前
0
0
docker 安装portainer、gogs、redis、mongodb、es、rabbitmq、mysql、jenkins、harbor

1、准备三台虚拟机ip如下 编号 Ip 1 192.168.100.101 2 192.168.100.102 3 192.168.100.103 2、镜像应用编排 192.168.100.101 主要安装系统运维相关服务 192.168.100.102 主要安装mysql、mon...

北岩
29分钟前
2
0
storm 提交任务报SocketException错误及解决办法

提交任务爆错: org.apache.storm.thrift.transport.TTransportException: java.net.SocketException: Broken pipe (Write failed) ..... Caused by: org.apache.storm.thrift.transport.TTr......

jingshishengxu
34分钟前
0
0
值得收藏:一份非常完整的MySQL规范

一、数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命...

Java干货分享
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部