SQL IN 里面放GROUP_CONCAT子查詢

查詢需求:用戶可以邀請其他人,而用戶又可以被其他人邀請,查詢出所有跟邀請人有關(guān)的邀請人id->結(jié)果作為條件
查詢過程:根據(jù)inviter_id(邀請人)查詢visitor_id(被邀請人)中有inviter_id的所有inviter_id 再加上自身的inviter_id

image.png

  1. 首先想到了用一個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é)果,生效的只是第一個逗號前的值

  2. 查找其他替代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)化

  1. 使用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有。最后什么都查不出來

  1. 最后完善結(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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容