Запрос не возвращает результатов, если данные не существуют в обеих таблицах - PullRequest
0 голосов
/ 10 февраля 2019

Итак, у меня есть два стола.Users содержит основную информацию о пользователе, а user_address содержит адрес пользователя '.Довольно просто.

У меня есть поисковая форма, которая позволяет пользователям искать.Одно поле поиска ищет несколько столбцов, используя LIKE.Он позволяет пользователям получать по их ...

названию компании (указанному в таблице пользователей) Имя (указанному в таблице адресов пользователей) Адрес электронной почты (таблица адресов пользователей) Телефон 1 (таблица адресов пользователей) Телефон 2(таблица адресов пользователей)

Форма запускает Ajax, который передает значение поиска на страницу поиска через $ _POST.

$ значение затем присваивается из $ _POST, фильтруется и затем передаетсяна запрос mysql.

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

Проблема в том, что иногда, когда «пользователь» добавляется в базу данных, адрес не вводится сразу.В этом случае при попытке поиска пользователя он не найден.

Он мне нужен, чтобы найти пользователей независимо от того, введен адрес или нет.Я пробовал «ПРИСОЕДИНЯТЬСЯ», «ВЛЕВО», «ВПРАВО», «ВНУТРЕННЕЕ СОЕДИНЕНИЕ» и т. Д. Кажется, ничего не работает.И по какой-то причине левое соединение замедляется вниз по запросу, а когда запрос запускается, страница застревает.

"SELECT u.id,u.company,a.name as address_name
FROM Users as u 
JOIN User_Address as a ON a.user_id = u.id 
WHERE a.name LIKE '%$value%' OR u.company LIKE '%$value%' OR a.email LIKE '%$value%' OR a.phone_1 LIKE '%$value%' OR a.phone_2 LIKE '%$value%' GROUP BY u.id”

Опять проблема с поиском заключается в том, что пользователь существует в таблице User, нодля этого пользователя в таблице адресов пользователей нет адресов.

1 Ответ

0 голосов
/ 10 февраля 2019

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

SELECT Users.id, Users.company, User_Address.name AS address_name
FROM (
  SELECT id AS user_id FROM Users WHERE u.company LIKE '%$value%'
  UNION
  SELECT user_id
  FROM User_Address
  WHERE a.name LIKE '%$value%'
  OR a.email LIKE '%$value%'
  OR a.phone_1 LIKE '%$value%'
  OR a.phone_2 LIKE '%$value%'
) AS matches
JOIN Users ON Users.user_id = matches.user_id
LEFT JOIN User_Address ON User_Address.user_id = Users.id
GROUP BY u.id

Кстати, LIKE '%$value%' выглядит так, как будто вы используете строковую интерполяцию для построения вашего запроса.Это может быть небезопасно.Убедитесь, что ваши значения правильно экранированы, и вы понимаете опасности и альтернативы (например, использование библиотеки привязки параметров).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...