SQL: сопоставить все элементы в массиве - PullRequest
1 голос
/ 07 марта 2020

У меня есть массив "тегов", хранящихся в кулинарии ie. Они отформатированы как последовательность слов, разделенных ,. Я пытаюсь вернуть все строки в таблице, где каждый «тег» этого массива находится в столбце «search_tags».

В настоящее время у меня есть:

$stmt = $conn->prepare("SELECT * FROM users WHERE MATCH search_tags AGAINST('". $_COOKIE['tags'] ."' IN BOOLEAN MODE);");

Это почти работает, но возвращает все строки, в которых совпадает ЛЮБОЙ из тегов. Вместо того, чтобы требовать ВСЕ из $_COOKIE['tags'] для соответствия столбцу "search_tags".

Альтернативное решение может заключаться в том, что он остается как запрос ИЛИ, но вместо этого сортирует результаты по количеству совпадений или релевантности.

1 Ответ

1 голос
/ 07 марта 2020

Вы можете использовать оператор + в логическом режиме , чтобы утверждать, что слово должно присутствовать, поэтому если вы преобразуете теги из списка через запятую в список +, который должен давать вам результат, который вы хотите:

$tags = '+' . implode(' +', explode(',', $_COOKIE['tags']));
$stmt = $conn->prepare("SELECT * FROM users WHERE MATCH search_tags AGAINST('$tags' IN BOOLEAN MODE);");

Обратите внимание, если у вас могут быть пробелы после запятых, вы должны использовать preg_split('/,\s*/', $_COOKIE['tags']) вместо explode.

...