Я хотел бы написать запрос так:
SELECT newsletter.email, newsletter.role,
IF(newsletter.role='buyer' AND buyers.join_id IS NOT NULL,buyers.first_name,
IF(newsletter.role='seller' AND sellers.join_id IS NOT NULL,sellers.first_name,
'Not Found')
) AS first_name
FROM newsletter
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id
WHERE newsletter.active = 1
Идея заключается в том, чтобы использовать LEFT JOIN
вместо INNER JOIN
, поэтому мы включаем данные NULL, затем присоединяемся к таблице buyers
и таблице sellers
. После объединения мы используем if-statements для выбора того, что хотим, исходя из роли пользователя в журнале рассылки новостей.
Edit:
Если вы не хотите, чтобы увидеть «Not Found» записи, как в приведенном выше, вы можете пропустить записи, где newsletter.join_id не совпадает с покупателем или продавцом. Но тогда вы не увидите бюллетень для этого конкретного журнала. Вы бы сделать это, регулируя WHERE
:
SELECT newsletter.email, newsletter.role,
IF(newsletter.role='buyer',buyers.first_name,sellers.first_name) AS first_name
FROM newsletter
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id
WHERE newsletter.active = 1 AND (
(newsletter.role='buyer' AND buyers.join_id IS NOT NULL)
OR
(newsletter.role='seller' AND sellers.join_id IS NOT NULL)
)
выше, вероятно, легче работать, особенно если вам нужно выбрать несколько столбцов либо из покупателя/продавца таблицы.
Edit 2:
Для случая администратора, вы бы просто нужно добавить OR newsletter.role='admin'
условию, то это будет выглядеть для вашей информации в таблице продавцов. Или вы можете запрограммировать свое имя в качестве -информации:
SELECT newsletter.email, newsletter.role, (
CASE newsletter.role
WHEN 'buyer' THEN buyers.first_name
WHEN 'seller' THEN sellers.first_name
WHEN 'admin' THEN 'Hard-code your name here'
ELSE 'unknown' END
) AS first_name
FROM newsletter
LEFT JOIN buyers ON newsletter.join_id = buyers.join_id
LEFT JOIN sellers ON newsletter.join_id = sellers.join_id
WHERE newsletter.active = 1 AND (
(newsletter.role='buyer' AND buyers.join_id IS NOT NULL)
OR
(newsletter.role='seller' AND sellers.join_id IS NOT NULL)
OR newsletter.role='admin'
)
Потребовалось некоторое время, чтобы понять ваш вопрос, но я вижу его сейчас. У вас есть таблица «покупателей» и таблица «продавцов». Тогда ваша таблица «newsletter» имеет столбец «роль», который содержит строку «покупатель» или «продавец», тогда вам нужно присоединиться к таблице рассылки к таблице «покупатель» или «продавец» на основе строки ' поле newsletter.role' содержит для этого конкретного участника. Ах. – Ultimater
Пожалуйста, не редактируйте мой пост, вы сделали это, чтобы кто-то просто учился, не имел бы представления о том, о чем вы говорите. Как сейчас, новичку легко следовать. – user3154948
Я категорически не согласен, это может быть ясно для вас, так как вы понимаете свою собственную ситуацию, но любому наблюдателю все, что они видят, - это запрос, который не работает без объяснения того, что он должен делать, а также с плохой грамматикой. это трудно выполнить, и запрос не подходит даже на 1 странице, так как все это на одной строке. Мои изменения помогли качеству вопроса для использования в stackoverflow, но если вы хотите поспорить об этом, прочитайте: http://stackoverflow.com/help/how-to-ask Здесь мы установили политики. Если вы не хотите, чтобы я редактировал ваш вопрос, это непонятно, так зачем отвечать на него? – Ultimater