Что не так с этим запросом JOIN? - PullRequest
1 голос
/ 16 декабря 2009

У меня есть список отчетов арендаторов, каждая ссылка указывает на идентификатор отчета.

Мне нужен этот запрос для выбора информации отчета и некоторой информации, относящейся к арендатору, который его отправляет.

Этот запрос корректно получает информацию отчета, но возвращает копии с каждым прикрепленным к нему арендатором:

SELECT 
reports.person_reporting, reports.request_type, reports.details, tenants.office,
tenants.email, tenants.alt_email, tenants.office_phone, tenants.personal_cell,
tenants.emergency_phone, tenants.address, tenants.building_name
FROM reports, tenants
WHERE reports.id = '{$id}'
AND (
    tenants.email = reports.email
    OR tenants.alt_email = reports.alt_email
)

в этом предложении AND мне нужно, чтобы он соответствовал адресу электронной почты клиента с адресом, содержащимся в отчете, с указанным идентификатором. Но каждый арендатор получает только электронную почту или альтернативную электронную почту, которая совпадает с любой электронной или альтернативной электронной почтой в отчетах (почти все, поскольку в большинстве из них не указана альтернативная электронная почта).

Есть ли для меня способ сделать это?

обновление

Моя проблема заключалась в том, что было много пустых полей alt_email, и он просто собирал их все. Приведенные ниже ответы были правильными при фильтрации пустых полей, но я просто изменил свое предложение OR на предложение AND, что было более понятно о том, как я хочу сопоставить их в любом случае: они оба должны совпадать, поскольку не должно быть дубликатов электронные письма в базе данных.

Ответы [ 2 ]

3 голосов
/ 16 декабря 2009

Я бы предположил, что ваша проблема в том, что есть группа арендаторов с alt_email = NULL и группа отчетов с alt_email = NULL, и ваше предложение OR будет сопоставлять каждый отчет с alt_email = NULL с all записи арендаторов с alt_email = NULL.

Вы, вероятно, должны поймать случай NULL:

WHERE reports.id = '{$id}'
AND (
  (tenants.email IS NOT NULL AND tenants.email = reports.email)
  OR (tenants.alt_email IS NOT NULL AND tenants.alt_email = reports.alt_email)
)
3 голосов
/ 16 декабря 2009

Вы, вероятно, должны отфильтровать 'нулевые' электронные письма, как это.

AND (
    (tenants.email != '' AND tenants.email = reports.email) OR
    (tenants.alt_email != '' AND tenants.alt_email = reports.alt_email)
)

В действительности это выглядит так, как будто это должно быть левое соединение, т.е.

SELECT 
reports.person_reporting, reports.request_type, reports.details, tenants.office,
tenants.email, tenants.alt_email, tenants.office_phone, tenants.personal_cell,
tenants.emergency_phone, tenants.address, tenants.building_name
FROM reports
LEFT JOIN tenants ON (
    (tenants.email != '' AND tenants.email = reports.email)
    OR (tenants.alt_email != '' AND tenants.alt_email = reports.alt_email)
)
WHERE reports.id = '{$id}'

Таким образом, вы получите отчеты без арендаторов хотя бы один раз.

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