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