需求分析
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