我有一个可能包含逗号分隔列表的变量。在我的数据库中,我还有一个列分隔列的列。
我知道我可以使用FIND_IN_SET(needle, haystack)
但是,如果我的变量包含一个列表,例如" a,b,c"如何检查列表中至少有一个项目是否与列中的至少一个项目匹配?这可能吗?
答案 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
这会产生以下查询:
// 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' ,',','|'), ')(,|$)');
这是我的解决方法。