mysql find_in_set字符串开头

时间:2018-08-24 10:40:51

标签: php mysql mysqli

我需要搜索以逗号分隔值的给定字符串开头的值。
示例,
我的栏中有“ 1_2_3_4_5_6、1_2_3_4_5_8、1_2_3_6_5_8”。我可以使用
搜索具有确切值的行 select * from table where find_in_set('1_2_3_4_5_6',column)     

但是,如果给出字符串的开始部分,该如何搜索?像这样的东西:
select * from table where find_in_set('1_2_3%',column)

3 个答案:

答案 0 :(得分:1)

如果我对您的理解正确(我仍然不确定),则可以使用:

SELECT * FROM table WHERE column LIKE '%1_2_3%';

这将为您提供值类似于的列:

1_2_3_4_5_5
1_4_5_, 1_2_3_4_5_, 6_7

以此类推。

但是您应该真的标准化表格。这对于良好的查询很重要,在性能方面也很重要。

根据@Xatenev的建议,如果您真的只喜欢值和每个匹配行的行,那么这将不能很好地工作,并且会产生大量开销。这是我要执行的步骤:

  1. 将所有CSV列拆分为多行(这是黑客和性能杀手,我找到了一些可行的解决方案,但未对其进行测试,请参见here):伪代码:SELECT ID, SPLIT(',', column) AS entries FROM table(不工作) )
  2. 过滤新的虚拟表以仅选择与前缀(SELECT * FROM virtual_table WHERE find_in_set("1_2_3%, entries) ORDER BY ID)匹配的行
  3. 将匹配的entries连接回每个ID的列表中。例如SELECT ID, GROUP_CONCAT(entries SEPARATOR ', ') FROM filtered_table GROUP BY ID
  4. 做点事情

未知部分是分割成多行的开头。有许多可能的解决方案都有其自身的缺点或优点。请注意,无论选择哪种方法,这都会导致很多性能损失。

附加节点:

在您所处的环境中可能会很冒险,就像我的第一个示例一样,使每一行都与您的搜索字符串匹配并在内存中进行过滤。这可能比在MySQL中执行此操作更快。

答案 1 :(得分:0)

您可以尝试使用“ REGEXP”

如果您想通过subtring匹配数据,请尝试

SELECT * FROM `table` WHERE `column` REGEXP '[, ]?1_2_3[^,]*,?' ;

如果您要精确开始比赛,请尝试

SELECT * FROM `table` WHERE `column` REGEXP '[, ]?1_2_3[^,]*,?' AND `column` NOT REGEXP '[^, ]1_2_3[^,]*,?' ;

答案 2 :(得分:0)

我能够使用无正则表达式解决它。索南的答案也是正确的。

SELECT * from table WHERE CONCAT(',', columnname, ',') like '%,1_2_3%'