Как искать несколько терминов с помощью AND в запросе SQL? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть простое веб-приложение, в котором перечислены различные типы данных в таблицах с возможностью поиска.

Я использую MySQL для базы данных.

Например, есть список сотрудников с именем FirstName , LastName и т. Д.

Пример Employees table:

ID  | FIRSTNAME | LASTNAME     | EMAILADDRESS
---------------------------------------------
001 | John      | Smith        | js@gmail.com
002 | John      | Jones        | jj@gmail.com
003 | Michael   | Smith        | ms@gmail.com
004 | Betty     | Taylor-Smith | bts@gmail.com

Там простое текстовое поле для поиска.

Искать John Smith результаты - это все, что содержит John И Smith:

001 | John      | Smith

Поиск John, результаты - все, что имеет John в it:

001 | John      | Smith
002 | John      | Jones

Искать Smith, результаты - все, что содержит Smith:

001 | John      | Smith
003 | Michael   | Smith
004 | Betty     | Taylor-Smith

Итак ... мой вопрос ... как мне напишите для этого запрос SQL?

select * from employees where ...

Если я ищу John Smith ...

((firstname like "%John%") OR (firstname like "%Smith%")) 
AND 
((lastname like "%John%") OR (lastname like "%Smith%"));
AND 
((emailaddress like "%John%") OR (emailaddress like "%Smith%"));

Возвращает нулевые результаты, потому что emailaddress не соответствует.

Если я заменю И на ИЛИ ...

((firstname like "%John%") OR (firstname like "%Smith%")) 
OR 
((lastname like "%John%") OR (lastname like "%Smith%"));
OR 
((emailaddress like "%John%") OR (emailaddress like "%Smith%"));

Тогда я получу все четыре результата, потому что в каждой строке есть John или Smith ... что не результат, который я хочу, мне нужна только первая строка 001.

001 | John      | Smith        | js@gmail.com
002 | John      | Jones        | jj@gmail.com
003 | Michael   | Smith        | ms@gmail.com
003 | Betty     | Taylor-Smith | bts@gmail.com

Как мне подойти к этому запросу SQL?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Могли бы вы потенциально использовать CONCAT_WS для удовлетворения ваших требований?

SELECT *
FROM employees
WHERE CONCAT_WS(" ", firstname, lastname) LIKE "%John Smith%"
OR firstname LIKE "%John Smith%" # in case user provides just a first name
OR lastname LIKE "%John Smith%" # in case user provides just a last name
OR emailaddress LIKE "%John Smith%" # support searching by e-mail at the same time
0 голосов
/ 05 мая 2020

Похоже, вы хотите:

((firstname LIKE "%John%") OR (lastname LIKE "%John%") OR (emailaddress LIKE "%John%")) 
AND 
((firstname LIKE "%Smith%") OR (lastname LIKE "%Smith%") OR (emailaddress LIKE "%Smith%")) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...