查詢需求:用戶可以邀請其他人,而用戶又可以被其他人邀請,查詢出所有跟邀請人有關(guān)的邀請人id->結(jié)果作為條件
查詢過程:根據(jù)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 )一開始也沒有報錯,所以看來是沒有問題的,后來經(jīng)過測試發(fā)現(xiàn)查詢的結(jié)果跟數(shù)據(jù)庫里的結(jié)果不匹配,最后的結(jié)果少了一個子查詢的第二個id
比如,in里面的結(jié)果是1339127322933985280,1337341587499253760, 1340843848854667264。最后把1337341587499253760丟掉了。
具體原因不知道,猜測是無論子查詢有多少結(jié)果,生效的只是第一個逗號前的值 -
查找其他替代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的第二個參數(shù)應該放置由concat拼接出來的,直接一個括號中間放逗號肯定會有問題,繼續(xù)優(yōu)化
- 使用sql里的拼接函數(shù)CONCAT
FIND_IN_SET(
ui.user_id,(
SELECT CONCAT(GROUP_CONCAT(inviter_id) ,',', 1340843848854667264)
FROM rv_user_invite
WHERE visitor_id = 1340843848854667264))
這樣就可以了,但是此時又忽略了一個重要條件
CONCAT函數(shù)拼接過程中只要有一個為null,其結(jié)果就為null
測試中可以把參數(shù)換成1337341587499253760,這個id在visitor_id列中沒有,在inviter_id有。最后什么都查不出來
- 最后完善結(jié)果,使用判斷函數(shù)IFNULL或者IF都可以
此時已經(jīng)確定了,只要子查詢結(jié)果正確,結(jié)果就正確
SELECT CONCAT(
IFNULL(GROUP_CONCAT(inviter_id),'-1'),',', 1337341587499253760)
FROM rv_user_invite WHERE visitor_id = 1337341587499253760)