【发布时间】:2013-05-09 03:04:44
【问题描述】:
基本上我想检查一个包含逗号分隔值的mysql文本列是否包含数组中包含的任何值。我知道这可以通过循环和多个查询来完成,但我希望只有一个查询。这可能吗?谢谢。
【问题讨论】:
基本上我想检查一个包含逗号分隔值的mysql文本列是否包含数组中包含的任何值。我知道这可以通过循环和多个查询来完成,但我希望只有一个查询。这可能吗?谢谢。
【问题讨论】:
我会使用这样的解决方案:
SELECT
*
FROM
yourtable
WHERE
str RLIKE
CONCAT('[[:<:]]', REPLACE('values,in,the,array', ',', '[[:>:]]|[[:<:]]'), '[[:>:]]')
这将产生以下字符串:
'values,in,the,array'
像这样:
[[:<:]]values[[:>:]]|[[:<:]]in[[:>:]]|[[:<:]]the[[:>:]]|[[:<:]]array[[:>:]]
[[:<:]] 和 [[:>:]] 是单词边界,因此它只会匹配整个单词,并且 |是 OR,因此它将匹配任何单词。请看小提琴here。
【讨论】:
你是说
... WHERE my_column LIKE '%first_array_value%' OR my_column LIKE '%second_array_value%'
它会起作用,但由于性能而非常糟糕。还有一种方法
... WHERE MATCH (my_column) AGAINST ('first_array_value second_array_value')
但最好的方法是尽可能改变数据结构。
【讨论】:
SELECT COUNT(*) FROM my_table WHERE (my_column LIKE '%,0,%' OR my_column LIKE '%,1,%');
或
SELECT COUNT(*) FROM my_table WHERE (my_column REGEXP LIKE '.*,[0-1],.*');
【讨论】: