Как сделать SELECT в mySQL по полю со списком значений

есть в таблице текстовое поле, в нем перечислены номера разделенные запятой, примерно так:

field_numbers '12,13,22,45'

Как сделать SELECT в mySQL по этому полю со списком значений что-то типа

select * from my_table where данное_значение присутствует в field_numbers


именно данное_значение - например, 1, то не должно найти потому как нет именно 1 (хотя 12 и 13 есть и в них есть цифра 1).

?


пс. в принципе это я так думаю, может задачу можно решить по-другому. Дело в том, что в поле field_numbers нужно как-то сохранить цифровые идентификаторы из другой таблицы, типа опции. Вариант связки 1-М в отдельной таблице не пойдет - база уже существует и курочить ее нельзя, а также в коде системы хотел бы обойтись минимумом изменений в многочисленных селектах. до этого в поле field_numbers сидел только 1 идентификатор и селект был просто на =...

1 ответов


по-моему можно использовать функцию FIND_IN_SET:
select * from my_table where FIND_IN_SET( данное_значение, field_numbers)>0

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set


Первое, что пришло в голову. Наверно, можно и получше.


SELECT * FROM `my_table` WHERE `field_numbers` REGEXP '(^|[[:space:][:punct:]])1([[:space:][:punct:]]|$)'
 

Лучше привести к нормальной форме Бойса Кодда.


Сделай маркер завершения номера, в данном случай запятая "12,13,22,45,"(и в конце тоже) и просто лайком можно выбрать.


SELECT * FROM `table` WHERE `field_numbers` LIKE '%22,%'
 

как-то так, если я правильно понял задачу:

SELECT * FROM t1, t2 WHERE t1.id IN (t2.field_numbers)