SQL --分支取数据

需求分析

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


转载于:https://my.oschina.net/u/2312022/blog/518969

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值