2014-12-02 143 views
1

我有一個名爲'user_permission'的表有一個名爲location_ids的列和數據類型是varchar(255)。我在這裏存儲的值如10,27,36。現在我想在IN比較運算符中使用此'location_ids'。以下查詢我已經嘗試過,但沒有得到我的預期結果。使用IN運算符的子查詢

SELECT (SELECT GROUP_CONCAT(`name` SEPARATOR ',') as name FROM location WHERE `remove` = 0 AND id IN(up.location_ids)) AS name FROM user_permission AS up 

但如果我提供IN(10,27,36),而不是(up.location_ids),那麼它的工作。

+0

簡單。請參閱標準化 – Strawberry 2014-12-02 08:34:33

+0

up.location_ids字段中的值是什麼? – SMA 2014-12-02 08:36:31

+0

@almasshaikh我的價值是10,27,36在up.location_ids字段 – mizan3008 2014-12-02 08:46:51

回答

1

使用FIND_IN_SET()功能

試試這個:

SELECT up.id, GROUP_CONCAT(l.name) AS `name` 
FROM user_permission AS up 
LEFT JOIN location l ON FIND_IN_SET(l.id, up.location_ids) AND l.remove = 0 
GROUP BY up.id; 

OR

SELECT (SELECT GROUP_CONCAT(`name` SEPARATOR ',') AS NAME 
     FROM location 
     WHERE `remove` = 0 AND FIND_IN_SET(id,up.location_ids) 
    ) AS NAME 
FROM user_permission AS up; 
+0

是的,你的第二個解決方案工作,你會給我一些澄清這個查詢嗎? – mizan3008 2014-12-02 08:52:32

+0

@ mizan3008 IN運算符所需的值不能指定字符串而不是不同的值。要在MySQL中實現這一點,你可以使用FIND_IN_SET()函數 – 2014-12-02 08:54:46

+0

明白了,謝謝兄弟:) – mizan3008 2014-12-02 09:18:01

0

看看這個工程

SELECT (SELECT GROUP_CONCAT(`name` SEPARATOR ',') as name FROM location WHERE `remove` = 0 AND id IN(select location_ids from user_permission)) AS name FROM user_permission 
相關問題