2015-12-02 2 views
1

У меня разные роли пользователей, покупателей и продавцов. Там, где их информация хранится, зависит от их роли. Таким образом, информация о покупателях будет храниться в таблице покупателей и продавцов в таблице продавцов. Также роль пользователя также сохраняется в таблице рассылки.Возможно ли использовать значение из другой таблицы в рамках одного и того же запроса?

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

Так что теперь мой вопрос, что можно написать что-то вдоль линий этого ...

$sql = "SELECT newsletter.email, newsletter.role as role, role.first_name 
     FROM newsletter INNER JOIN role ON newsletter.join_id = role.join_id 
     WHERE newsletter.active = 1"; 
+0

Потребовалось некоторое время, чтобы понять ваш вопрос, но я вижу его сейчас. У вас есть таблица «покупателей» и таблица «продавцов». Тогда ваша таблица «newsletter» имеет столбец «роль», который содержит строку «покупатель» или «продавец», тогда вам нужно присоединиться к таблице рассылки к таблице «покупатель» или «продавец» на основе строки ' поле newsletter.role' содержит для этого конкретного участника. Ах. – Ultimater

+0

Пожалуйста, не редактируйте мой пост, вы сделали это, чтобы кто-то просто учился, не имел бы представления о том, о чем вы говорите. Как сейчас, новичку легко следовать. – user3154948

+0

Я категорически не согласен, это может быть ясно для вас, так как вы понимаете свою собственную ситуацию, но любому наблюдателю все, что они видят, - это запрос, который не работает без объяснения того, что он должен делать, а также с плохой грамматикой. это трудно выполнить, и запрос не подходит даже на 1 странице, так как все это на одной строке. Мои изменения помогли качеству вопроса для использования в stackoverflow, но если вы хотите поспорить об этом, прочитайте: http://stackoverflow.com/help/how-to-ask Здесь мы установили политики. Если вы не хотите, чтобы я редактировал ваш вопрос, это непонятно, так зачем отвечать на него? – Ultimater

ответ

1

Я хотел бы написать запрос так:

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' 
) 
+0

Должен быть только один не найденный случай ... и это мой личный логин, так как моей ролью является «admin». Если есть, у меня МНОГО БОЛЬШИХ проблем! LOL и мое членство не регистрируются нигде, кроме таблицы участников. Все пользователи регистрируются как покупатель или продавец, и он проверяется несколько раз через процесс регистрации в 3 этапа .... – user3154948

+0

Для случая роли администратора, если вы хотите включить себя в результаты, d добавить 'OR newsletter.role = 'admin'' к ГДЕ. Но тогда он будет искать вас в таблице продавцов из-за того, как записывается if-statement. Таким образом, вы также можете настроить это, если хотите использовать жестко заданное значение для своей роли. Ooor, вы можете создать таблицу «admin», если у вас будет более одной учетной записи администратора, а затем «LEFT JOIN» на нее тоже и больше усложнит ваши if-statements. Если SQL становится слишком сложным, он может избежать JOINS и просто делать отдельные запросы с PHP. – Ultimater

+0

Для этого я являюсь тем, кто пишет бюллетень, поэтому я не заинтересован в его получении. Что касается наличия более одного администратора, это большой вопрос! Моя контролирующая природа никогда не позволит этого. LOL У меня было это как два отдельных запроса, но новый сервер, на котором он установлен, не включает mysqlnd и все, что попадает в ассоциативный массив, приемлемый для swiftmailer, был проблемой BIG pia. Поэтому объединение всего в один большой запрос было единственным достаточно простым ответом. – user3154948

Смежные вопросы