2014-12-02 3 views
1

У меня есть таблица с именем 'user_permission', есть столбец с именем location_ids и Тип данных - varchar (255). Я сохранил здесь значение, подобное 10,27,36. Теперь я хочу использовать это «location_ids» в операторе сравнения IN. Следующий запрос, который я пробовал, но я не получил ожидаемого результата.SubQuery с использованием оператора 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

+0

Какова ценность, например, в поле up.location_ids? – SMA

+0

@almasshaikh мое значение 10,27,36 в up.location_ids поле – mizan3008

ответ

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; 

ИЛИ

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

+0

@ mizan3008 Операции, требуемые оператором IN, вы не можете указать строку вместо разных значений. Для достижения этой цели в MySQL вы можете использовать функцию FIND_IN_SET() –

+0

Получил это, спасибо bro :) – mizan3008

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