Найдите несколько игл в FIND_IN_SET

У меня есть переменная, которая может содержать разделенный запятыми список. В моей базе данных у меня также есть столбец со списком, разделенным столбцами.

Я знаю, что могу найти одно значение в этом столбце БД, используя FIND_IN_SET(needle, haystack)

Однако, если моя переменная содержит список, такой как «a, b, c», как я могу проверить, соответствует ли хотя бы один элемент в списке хотя бы одному элементу в столбце? Это возможно?

0

Решение

Похоже, вам, вероятно, нужны таблицы ссылок в вашей базе данных. Хранение разделенных запятыми списков в столбцах для сравнения с другими разделенными запятыми списками ухудшит вашу производительность, если вы достигнете любого масштаба.

Я настоятельно рекомендую вам прочитать больше о связывании таблиц (ассоциативных объектов), чтобы, возможно, убедить вас немного изменить дизайн вашей базы данных:
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 который указывает, что одно из ваших поисковых значений находится в вашем наборе.

1

Другие решения

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

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

Это моё решение.

0

По вопросам рекламы [email protected]