Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql在\u集合中查找\u字符串,以_Php_Mysql_Mysqli - Fatal编程技术网

Php mysql在\u集合中查找\u字符串,以

Php mysql在\u集合中查找\u字符串,以,php,mysql,mysqli,Php,Mysql,Mysqli,我需要在逗号分隔的值中搜索以给定字符串开头的值。 实例 我的专栏里有“1_2_3_4_5_6,1_2_3_4_5_8,1_2_3_6_5_8”。我可以使用 从查找集合“1\u 2\u 3\u 4\u 5\u 6”列中的表格中选择* 但是,如果字符串的起始部分给定,如何搜索呢?大概是这样的: 从查找集合“1\u 2\u 3%”列中的\u的表格中选择* 如果我理解正确,我仍然不确定我是否理解,您可以使用: SELECT * FROM table WHERE column LIKE '%1_2_3%

我需要在逗号分隔的值中搜索以给定字符串开头的值。 实例 我的专栏里有“1_2_3_4_5_6,1_2_3_4_5_8,1_2_3_6_5_8”。我可以使用 从查找集合“1\u 2\u 3\u 4\u 5\u 6”列中的表格中选择*

但是,如果字符串的起始部分给定,如何搜索呢?大概是这样的:
从查找集合“1\u 2\u 3%”列中的\u的表格中选择*

如果我理解正确,我仍然不确定我是否理解,您可以使用:

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的建议,如果您真的只喜欢每个匹配行的值和行,那么这将不会很好地工作,并且会产生大量开销。以下是我将执行的步骤:

将所有CSV列拆分为多行这是一个黑客和性能杀手,我找到了一些可行的解决方案,但没有对其进行测试,请参阅:伪代码:选择ID,拆分“,”列作为表中的条目不起作用 筛选新的虚拟表,以仅从虚拟表中选择与前缀select*匹配的行,虚拟表中的find_in_set1_2_3%,条目按ID排序 将匹配项重新连接到每个ID的列表中。例如,按ID选择ID、GROUP_CONCATentries SEPARATOR'、'FROM filtered_table GROUP BY ID 做点什么 未知部分是以拆分为多行的开头。有很多可能的解决方案,都有各自的缺点或优点。请注意,无论选择何种方法,这都会导致性能下降

附加节点:


在您的情况下,让每一行匹配您的搜索字符串(如我的第一个示例中所示)并在内存中过滤它们可能是一种冒险。这可能比在MYSQL中执行要快。

您可以尝试使用“REGEXP”

如果要将数据与子字符串匹配,请尝试此操作

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[^,]*,?' ;

如果您想要精确的开始匹配,请尝试此

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[^,]*,?' ;

我不用正则表达式就能解决这个问题。索纳姆的回答也是正确的

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

那么,您有一个列,其中包含例如1_2_3_4_5_6和/或1_2_3_4_5_6、1_2_3_4_5_8、1_2_3_6_5_8?我不确定你的数据结构。如果列包含多个值,是否只需要与搜索字符串匹配的值,还是可以重新运行整行?如果符合搜索条件,我需要获取行。。我已经更新了问题。如果有什么不清楚的,告诉我。我不确定,但我认为在集合中查找是不可能的。您可能可以尝试使用正则表达式解决方案,但这不是一个好方法:/。类似于您应该真正规范化您的数据结构,并将这些值放在一个单独的表中的单独行中,然后SQL语言可以极大地帮助您,这就是它的用途。在字符串操作层面上处理这个问题是一种糟糕而乏味的方法。他的值是用逗号分隔的显然,这样做不起作用,因为它会作用于整个列,而不仅仅是逗号分隔的值,为什么不呢?当列非列中的值为逗号分隔时,类似于将捕获包含任何匹配字符串的任何行,即使它们位于分隔列表的中间或结尾。您可以使用SELECT*从SELECT 1_4_5_、1_2_3_4_5_、6_7作为列t进行测试,其中t.col类似于%1_2_3%。如果他只喜欢我问的值匹配,这就行不通了。但如果这场争吵足以让他明白我是如何理解他的评论的,这将是他想要的。是的,那不是他想要的。正如您在他的示例中所看到的,他希望类似于在_set1_2_3中查找_的内容,这意味着他希望在逗号分隔的字符串中查找一个值,以1_2_3开头,以任何通配符结尾。这不是你的代码所做的。我只是从他的示例代码判断:find_in_set1_2_3%。也许我误解了他,你是对的。我根据你的理解改变了我的回答。也许这可以帮助OP。这将只找到一个匹配条目。这并不是比使用类似“%1\u 2\u 3%”的方法更好的解决方案。而且,SQL上的正则表达式是成本密集型的。是的!!我同意你关于SQL的正则表达式是成本密集型的。但是,如果我们使用像“%1_2_3%”这样的字符串,那么它将不会按照给定的要求搜索以精确匹配字符串开头的字符串,它将搜索包含1_2_3的字符串,而不是以1_2_3开头的字符串。这就是我尝试使用正则表达式的原因。