需求分析mysql
1.写一条SQL语句,返回一个list,list中存放的对象有个属性是type(有三种状况),需求:根据这个type关联不一样的表。
sql
常规思路数据库
先写SQL取到这个list,在判断list中每一个对象的type,再根据不一样的type再去数据库表里查询一次。
ui
常规思路弊端code
若是返回的是一个对象,这样分步作是没有问题的;可是这个地方返回的是一个list,在外层的list里面套个循环来判断每一个对象的type,在根据type不一样,分别去联合不一样的表查数据,这种想法很明显的不是最佳方案,假设list的数据成千上百条,
对象
在套个for循环,查询时间可想可知。for循环
解决思路class
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