2016-07-29 2 views
0

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

Вот скриншот с пустым поиском:

enter image description here

клиентов всегда должны быть видны (соответствие поискового запроса). Так вот несколько примеров:

  • Поиск проекта2 Выведите client2 с проекта2
  • Поиск client2 Выведите client2 со всеми проектами
  • Поиск client3 Выведите client3

я запросить проектов и присоединяться к таким клиентам:

SELECT * 
FROM projects AS a 
LEFT JOIN clients AS b ON a.client_id = b.id 
WHERE a.name LIKE '%$searchString%' OR b.name LIKE '%$searchString%' 

После этого я запрашиваю клиентов, исключая те, которые были выбраны в запросе выше. Это единственный способ (который я знаю), чтобы получить клиентов, у которых нет проектов.

Есть ли инструкция, которая может получить эти результаты по запросу? Это кажется мне не очень изящным. Также, если я выполняю поиск client2 project1, система выходит из строя.

EDIT: Спасибо за ответы до сих пор. Я получил много с полным объединением, которые невозможно в mysql. Я изменил это в заголовке и тегах вопроса ... извините за это. Я ничего не знал о полных соединениях и что они невозможны в mysql.

+0

Попробуйте изменить 'ЛЕВЫЙ JOIN' в' FULL OUTER JOIN'. –

+0

Или, наоборот, переключите порядок ваших таблиц, чтобы левое объединение включало нулевые проекты или сохраняло их в одном порядке и переключалось на правильное соединение. –

ответ

0

Сделайте RIGHT JOIN, который предоставит вам всех клиентов независимо от того, есть ли у них проект, а затем WHERE a.name IS NULL предоставит вам только клиентов без проектов.

Таким образом, весь запрос выглядит

SELECT * 
FROM projects AS a 
RIGHT JOIN clients AS b ON a.client_id = b.id 
WHERE a.name IS NULL 
1

Here хорошее визуальное представление различных типов объединений в SQL.

Убедитесь, что вы используете подготовленные операторы, а не напрямую помещаете searchString в запрос, так как это происходит при атаках SQL-инъекций.

SELECT 
    * 
FROM 
    clients b LEFT OUTER JOIN 
    projects AS a ON a.client_id = b.id 
WHERE 
    a.name LIKE '%$searchString%' OR 
    b.name LIKE '%$searchString%' 
+0

Спасибо за сообщение. Я уже знаю о SQL-инъекции –

0

Вы можете написать этот

SELECT 
     * 
    FROM 
     clients b FULL OUTER JOIN 
     projects AS a ON a.client_id = b.id 
    WHERE 
     a.name LIKE '%$searchString%' OR 
    b.name LIKE '%$searchString%' 
Смежные вопросы