需求:獲取用戶A和用戶B的關係(關係包括:關注(00)、被關注(01)、相互關注(02)、無任何關係(該條記錄不存在))前端
接口:{Host}/getUserHomePageInfo/userIdA/userIdBjava
數據庫表顯示sql
由數據庫設計可知:數據庫
1000000006能夠在A位置,也能夠在B位置。即以下兩條是同一個意思,都是1000000006關注1000000005數據庫設計
1000000006 1000000005 00設計
1000000005 1000000006 01code
同時也說明,上述兩條數據不可能同時存在在數據庫。接口
現在的需求是查找06和05的關係get
傳入參數:userIdA和userIdB
io
傳出參數:flag
思路:
1.先用userIdA和userIdB去查詢有沒有這條記錄,若是沒有,則flag='xx'
SELECT USER_ID_A, CASE count(*) WHEN 0 THEN 'xx' ELSE tuf.FOLLOW_FLAG END as flag FROM t_user_follow tuf WHERE ( USER_ID_A = 1000000006 AND USER_ID_B = 1000000005 ) OR ( USER_ID_A = 1000000005 AND USER_ID_B = 1000000006 )
2.有關係的話,將取出來的USER_ID_A與傳入的參數userIdA比較,
2-1 若是相等,則說明userIdA在A位置,則取出來的flag直接顯示
2-2 若是不等,則說明userIdA在B位置,
2-2-1 若是取出來的值爲'01',則說明A關注B,此時返回給前端的應該是'00'
2-2-2 其餘值,直接顯示
SQL以下
傳進來的值:userIdA:1000000006,userIdB:1000000005
SELECT CASE tall.USER_ID_A WHEN 1000000006 THEN ( SELECT #userIdA在數據庫A位置,flag直接顯示 tuf.FOLLOW_FLAG FROM T_USER_FOLLOW AS tuf WHERE ( USER_ID_A = 1000000006 AND USER_ID_B = 1000000005 ) ) ELSE ( SELECT CASE tuf.FOLLOW_FLAG #userIdA在數據庫B位置,若是flag爲'01',則將其轉成'00' WHEN '01' THEN '00' ELSE tuf.FOLLOW_FLAG END FROM T_USER_FOLLOW AS tuf WHERE ( USER_ID_A = 1000000005 AND USER_ID_B = 1000000006 ) ) END AS attentionFlag FROM t_user_follow tall WHERE ( USER_ID_A = 1000000006 AND USER_ID_B = 1000000005 ) OR ( USER_ID_A = 1000000005 AND USER_ID_B = 1000000006 )
項目經理的寫法以下:能夠知足需求,可是沒有數據時,不能返回xx,這個判斷只能到java裏面去判斷
SELECT CASE USER_ID_A WHEN 1000000005 THEN CASE tuf.FOLLOW_FLAG WHEN '01' THEN '00' WHEN '00' THEN '01' ELSE tuf.FOLLOW_FLAG END ELSE tuf.FOLLOW_FLAG END AS attentionFlag FROM T_USER_FOLLOW AS tuf WHERE ( USER_ID_A = 1000000006 AND USER_ID_B = 1000000005 ) OR ( USER_ID_A = 1000000005 AND USER_ID_B = 1000000006 )
通過認真思考後,我改寫了項目經理的SQL,使能知足沒有數據時,返回'xx'的狀況,SQL以下
SELECT CASE count(*) #無數據時,返回'xx' WHEN 0 THEN 'xx' ELSE #有數據時,判斷傳進來的userIdB在數據庫的位置 CASE USER_ID_A #userIdB在數據庫A位置 #查出的關係若是是'01',說明06關注05,返回給前端的應該是'00' #查出的關係若是是'00',說明05關注06,返回給前端的應該是'01',即06被05關注 WHEN 1000000005 THEN CASE tuf.FOLLOW_FLAG WHEN '01' THEN '00' WHEN '00' THEN '01' ELSE tuf.FOLLOW_FLAG END ELSE #userIdB在數據庫B位置,則返回的關係不變 tuf.FOLLOW_FLAG END END as attentionFlag FROM t_user_follow tuf WHERE ( USER_ID_A = 1000000006 AND USER_ID_B = 1000000005 ) OR ( USER_ID_A = 1000000005 AND USER_ID_B = 1000000006 )
總結:最後一次SQL能夠完整的知足最開始的需求。