У меня есть переменная, которая может содержать разделенный запятыми список. В моей базе данных у меня также есть столбец со списком, разделенным столбцами.
Я знаю, что могу найти одно значение в этом столбце БД, используя FIND_IN_SET(needle, haystack)
Однако, если моя переменная содержит список, такой как «a, b, c», как я могу проверить, соответствует ли хотя бы один элемент в списке хотя бы одному элементу в столбце? Это возможно?
Похоже, вам, вероятно, нужны таблицы ссылок в вашей базе данных. Хранение разделенных запятыми списков в столбцах для сравнения с другими разделенными запятыми списками ухудшит вашу производительность, если вы достигнете любого масштаба.
Я настоятельно рекомендую вам прочитать больше о связывании таблиц (ассоциативных объектов), чтобы, возможно, убедить вас немного изменить дизайн вашей базы данных:
https://en.wikipedia.org/wiki/Associative_entity
Чтобы ответить на ваш вопрос о том, как вы будете использовать FIND_IN_SET
чтобы выполнить несколько поисков в одном запросе, вам нужно будет построить свой запрос динамически.
Вот простой пример, показывающий, как динамически создавать запрос. Пожалуйста, примите правильные меры для предотвращения внедрения SQL (http://php.net/manual/en/security.database.sql-injection.php).
// 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 . ';';
Пример: https://eval.in/867963
Это производит следующий запрос:
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 до N, если строка str находится в списке строк strlist, состоящем из N подстрок.
Возвращает 0, если str отсутствует в strlist или если strlist является пустой строкой.
https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set
Пример запроса даст 1
который указывает, что одно из ваших поисковых значений находится в вашем наборе.
SELECT `column_A` REGEXP CONCAT('(,|^)(', REPLACE( `column_B` ,',','|'), ')(,|$)');
SELECT '123,456,789' REGEXP CONCAT('(,|^)(', REPLACE( '1234,456,6789' ,',','|'), ')(,|$)');
Это моё решение.