2012-06-02 3 views
1

В качестве примера я это как поле в колонке:Запрашивание несколько значений на разделенных запятой поля

3,21,23,41,47,56,57,61,64,74,78 , 79,82,83,86,90,94

Эти идентификаторы, и я пытаюсь выяснить, как я могу найти несколько номеров, которые я пробовал, например:

SELECT * FROM table WHERE status='A' AND (FIND_IN_SET('3,64', myids)) 

Кажется, что это работает, только если 3 и 64 были вместе и выводят find_in _set для каждого значения может быть немного больно.

Любые лучшие решения или предложения?

+1

Вы должны серьезно подумать о том, чтобы адаптировать структуру вашей таблицы - запрос такого типа данных в СУБД представляет собой PITA. Вместо этого лучше используйте таблицу подробностей - намного чище, проще запросить/удалить/обновить/вставить отдельные записи и т. Д. –

+0

К сожалению, я работаю с базой данных, которая уже существует (иначе я бы сделал это по-другому :(). – user1264969

+0

В этом Я бы выбрал регулярные выражения - вы не можете использовать простой поиск подстроки, так как поиск «3» также найдет «23» и т. д. Что-то вроде ... WHERE myids rlike ('(^ |,) 3 (, | $) ') и myids rlike (' (^ |,) 64 (, | $) '), который соответствует началу строки или a, за которой следует ваш номер, за которым следует конец строки или запятая (не 100 % just about синтаксис regex MySQL, хотя) –

ответ

2

FIND_IN_SET() только находит положение первого аргумента (см. MySQL Reference, String Functions).

Вы можете использовать один FIND_IN_SET для каждого идентификатора вы ищете:

SELECT * FROM table WHERE status='A' AND 
    FIND_IN_SET('3', myids) AND FIND_IN_SET('64', myids) 
+0

Но это также будет соответствовать «63» и «264», не так ли? –

+2

Нет, не будет! Набор представляет собой список строк, разделенных запятой, а 'FIND_IN_SET' возвращает только индекс, в котором находится строка _complete_. – mixable

+0

Спасибо за это. Это сработало. :) – user1264969

2
SELECT * FROM table WHERE status='A' AND myids in (3, 64) 

Вы можете попробовать это.

-1
foreach($ids as $id) 
{ 
    SELECT * FROM table WHERE status='A' AND (FIND_IN_SET($id, myids)) 
} 

that check one by one and getting the result from table. 
0

SELECT * FROM таблицы WHERE myids REGEXP REPLACE ("3,64", '', '(\ | $) |');

+1

Хотя этот код может помочь решить проблему, он не объясняет _why_ и/или _how_, он отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшит его долгосрочную образовательную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, включая ограничения и допущения. –

Смежные вопросы