在FIND_IN_SET中找到多个针

时间:2017-09-24 23:44:30

标签: php arrays mysqli find-in-set

我有一个可能包含逗号分隔列表的变量。在我的数据库中,我还有一个列分隔列的列。

我知道我可以使用FIND_IN_SET(needle, haystack)

在该db列中找到单个值

但是,如果我的变量包含一个列表,例如" a,b,c"如何检查列表中至少有一个项目是否与列中的至少一个项目匹配?这可能吗?

2 个答案:

答案 0 :(得分:1)

听起来您可能需要在数据库中使用一些链接表。在列中存储逗号分隔列表以与其他逗号分隔列表进行比较,如果达到任何规模,将会损害您的性能。

我强烈建议您阅读有关链接表(关联实体)的更多内容,或许可以说服您稍微更改数据库设计: https://en.wikipedia.org/wiki/Associative_entity

要回答有关如何使用{:bar=>"bar"}在单个查询中执行多个搜索的问题,您需要动态构建查询。

这是一个简单的向您展示如何动态构建查询的基本示例。 请采取适当措施防止SQL注入(http://php.net/manual/en/security.database.sql-injection.php)。

FIND_IN_SET

示例:https://eval.in/867963

这会产生以下查询: // This is the list you want to search against - for your actual implementation you would use your column name $haystack_str = '2,4,6,8,10'; // This is the comma separated list you want to use as your needle $search_str = '1,2,3'; // Break the string apart into separate values $search_array = explode(',', $search_str); // Store your query fragments $query_array = array(); // Loop through each string value you want to use as your needle foreach ($search_array as $needle) { // PLEASE TAKE PRECAUTIONS AGAINST SQL INJECTION !!! $query_array[] = sprintf('FIND_IN_SET("%s","%s")', $needle, $haystack_str); } // Join all pieces together using OR $query_str = implode(' OR ', $query_array); // Show your example query echo 'SELECT ' . $query_str . ';';

  

如果字符串str位于由N个子字符串组成的字符串列表strlist中,则返回1到N范围内的值。   如果str不在strlist中,或者strlist是空字符串,则返回0。   https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

示例查询将生成SELECT FIND_IN_SET("1","2,4,6,8,10") OR FIND_IN_SET("2","2,4,6,8,10") OR FIND_IN_SET("3","2,4,6,8,10");,表示您的一个搜索值位于您的设置中。

答案 1 :(得分:0)

SELECT `column_A` REGEXP CONCAT('(,|^)(', REPLACE( `column_B` ,',','|'), ')(,|$)');

SELECT '123,456,789' REGEXP CONCAT('(,|^)(', REPLACE( '1234,456,6789' ,',','|'), ')(,|$)');

这是我的解决方法。