1. 程式人生 > >解決mysql的in條件中引數是帶引號的字串的時候查詢失效

解決mysql的in條件中引數是帶引號的字串的時候查詢失效

在開發中有時會使用到in查詢,並且裡面的引數又是資料庫中的一個欄位,比如如下錯誤的例子


SELECT
    `ag`.`id`,
    `ag`.`rules`,
    (
        SELECT 
            GROUP_CONCAT(ar.title)
        FROM
            auth_rule ar 
        WHERE 
            ar.id IN (ag.rules)
    ) as rulesName
FROM
    `auth_group` `ag`

上面語句查詢的表是常用的後臺許可權表,表資料如下:

這裡寫圖片描述

上面查詢角色擁有的規則名稱,但是這裡傳進去的是ag.rules,其實這個欄位傳進去實際上在資料庫是這樣查詢的(多了個引號):

ar.id IN ('4,3')

而不是

ar.id in (4,3)

在mysql中in裡面如果是字串的話,會自動轉化成int型別的,內部使用瞭如下方法:

CAST('4,3' AS INT)

強轉之後’4,3’會變成4,所以查詢出來的結果只是一條而已。這個問題其實可以使用另外一個mysql的函式來解決:

FIND_IN_SET('查詢的值(如:1)', '使用逗號隔開的字串集合,如:('1,2,3')')

正確的sql語句如下:

SELECT
    `a
g`.`id`, `ag`.`title`, `ag`.`status`, `ag`.`rules`, ( SELECT GROUP_CONCAT(ar.title) FROM auth_rule ar WHERE FIND_IN_SET(ar.id,ag.rules) ) as rulesName FROM `auth_group` `ag`