查詢需求:用戶可以邀請其他人,而用戶又可以被其他人邀請,查詢出所有跟邀請人有關的邀請人id->結果作為條件
查詢過程:根據inviter_id(邀請人)查詢visitor_id(被邀請人)中有inviter_id的所有inviter_id 再加上自身的inviter_id
image.png
-
首先想到了用一個in語句,in里面放一個子查詢,子查詢后面拼上自己的id
WHERE ui.user_id IN ( (SELECT GROUP_CONCAT(inviter_id) FROM rv_user_invite WHERE visitor_id = 1340843848854667264),1340843848854667264 )
一開始也沒有報錯,所以看來是沒有問題的,后來經過測試發現查詢的結果跟數據庫里的結果不匹配,最后的結果少了一個子查詢的第二個id
比如,in里面的結果是1339127322933985280,1337341587499253760, 1340843848854667264。最后把1337341587499253760丟掉了。
具體原因不知道,猜測是無論子查詢有多少結果,生效的只是第一個逗號前的值 -
查找其他替代in的方法:FIND_IN_SET
FIND_IN_SET( ui.user_id,( (SELECT GROUP_CONCAT(inviter_id) FROM rv_user_invite WHERE visitor_id = 1340843848854667264), 1340843848854667264))
此時會報錯1241 - Operand should contain 1 column(s), Time: 0.012000s
FIND_IN_SET的第二個參數應該放置由concat拼接出來的,直接一個括號中間放逗號肯定會有問題,繼續優化
- 使用sql里的拼接函數CONCAT
FIND_IN_SET(
ui.user_id,(
SELECT CONCAT(GROUP_CONCAT(inviter_id) ,',', 1340843848854667264)
FROM rv_user_invite
WHERE visitor_id = 1340843848854667264))
這樣就可以了,但是此時又忽略了一個重要條件
CONCAT函數拼接過程中只要有一個為null,其結果就為null
測試中可以把參數換成1337341587499253760,這個id在visitor_id列中沒有,在inviter_id有。最后什么都查不出來
- 最后完善結果,使用判斷函數IFNULL或者IF都可以
此時已經確定了,只要子查詢結果正確,結果就正確
SELECT CONCAT(
IFNULL(GROUP_CONCAT(inviter_id),'-1'),',', 1337341587499253760)
FROM rv_user_invite WHERE visitor_id = 1337341587499253760)