MySQL поиск 1,2,3,11,22,33 в поле - PullRequest
       13

MySQL поиск 1,2,3,11,22,33 в поле

1 голос
/ 07 января 2010

Могу ли я искать 1, 2 и 3 без ложного совпадения, потому что 11,22,33 находятся в поле?

Поле со строкой = "11,22,33" не должно возвращать никаких результатов.

Ответы [ 4 ]

2 голосов
/ 07 января 2010

Прежде всего, использование значений в поле, разделенных запятыми, проблематично, и вы должны вместо этого сохранить их в отдельной таблице. Тогда вы сможете получить запись более эффективно:

select ...
from mainTable t
inner join valueTable v1 on v1.id = t.id and v1.value = 1
inner join valueTable v2 on v2.id = t.id and v2.value = 2
inner join valueTable v3 on v3.id = t.id and v3.value = 3

Если это невозможно, вы должны пойти по пути медленного сопоставления строк. Чтобы сопоставить значения в строке через запятую, вы можете использовать оператор like:

... where
  concat(',', someField, ',') like '%,1,%' and
  concat(',', someField, ',') like '%,2,%' and
  concat(',', someField, ',') like '%,3,%'

Размещение разделителя с обеих сторон искомого значения гарантирует, что вы не получите ложных срабатываний. Добавление запятых до и после значения поля гарантирует, что вы сможете найти первое и последнее значение.

2 голосов
/ 07 января 2010

Используйте сопоставление регулярных выражений с регулярными выражениями (^|,)1($|,) и (^|,)2($|,) и (^|,)3($|,)

1 голос
/ 07 января 2010

Рассматривали ли вы, какой оптимальный поиск для значения 11 будет делать в вашем случае?

Поскольку нет возможности сузить поиск, он обречен на сканирование таблицы, чтобы найти соответствующие значения.

Вам следует серьезно подумать о том, чтобы разбить эти значения на отдельную таблицу, где у вас есть одна строка на значение, и все они связаны с исходной строкой в ​​исходной таблице.

Это было бы гораздо правильнее, намного эффективнее и гораздо проще иметь дело.

Сказав, что, если вы все еще хотите использовать свой текущий подход, вы можете искать значение, выполнив следующее:

WHERE ','+ column + ',' LIKE '%,' + value + ',%'

Это будет искать ',11,22,33,' для '%,11,%', обратите внимание на запятые в каждом конце столбца и значение, это гарантирует, что вы не получите ложных срабатываний из-за частичных совпадений.

0 голосов
/ 07 января 2010

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

FIND_IN_SET(1,column) AND FIND_IN_SET(3,column) AND etc;

Он предназначен для использования с типом SET, но также работает с основным списком, разделенным запятыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...