Как искать несколько слов одним запросом? - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь выполнить простой поиск php по следующему запросу. Это работает отлично, однако запрос дает результаты только для первого слова. Был бы способ получить объединенный результат для всех трех слов, используя один запрос?

$stmt = $pdo->prepare("SELECT * FROM walldb WHERE (wallname LIKE :searchq1 OR :searchq2 OR :searchq3) LIMIT :stat, :limt");

Ответы [ 4 ]

2 голосов
/ 01 марта 2020

Вам необходимо повторить шаблон expr like val:

WHERE wallname LIKE :searchq1 OR wallname LIKE :searchq2 OR wallname LIKE :searchq3

Что связано с вашим исходным кодом, так это то, что он интерпретируется как:

WHERE 
    (wallname LIKE :searchq1)
    OR (:searchq2)
    OR (:searchq3)

Таким образом, в основном, два последних поиска Термины оцениваются в логическом контексте, как если бы они были условиями. Если один из поисковых терминов начинается с 1, он оценивается как true (и все строки в таблице будут возвращены); иначе, если ни один из них не начинается с 1, условия ложные, поэтому в игру вступает только первое условие (то, что вы видите).

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

Возможно, вы захотите рассмотреть регулярные выражения. Вы можете express, что вы хотите, как:

where wallname regexp concat('^', concat_ws('|', :searchq1, :searchq2, :searchq3), '$')

, предполагая, что параметры не содержат специальных символов.

Однако, возможно, вам следует рассмотреть одно регулярное выражение. Тогда вы могли бы express условие как:

where allname regexp '^abc|def|ghi$')
1 голос
/ 01 марта 2020

Вы не можете использовать OR в том виде, как вы показываете. :searchq2 не является допустимым выражением где. Вам необходимо сделать следующее:

wallname LIKE :searchq1 OR wallname LIKE :searchq2 OR wallname LIKE :searchq3
0 голосов
/ 01 марта 2020

Если вы хотите уменьшить время выполнения запроса, используйте UNION ALL (столько частей, сколько нужно объединить, чем «ИЛИ»). В противном случае (прозрачный и короткий скрипт) используйте все условия в одной строке - как указано выше.

...