2016-01-04 4 views
-1

Скажем, у меня есть 3 таблицы: пользователи, подписка и premium_subscriptionsSQL 3 таблицы присоединиться, где первые два внутренние затем внешний

  • пользователи имеет идентификатор, first_name, last_name и т.д.
  • подписка имеет Идентификация, user_id, magazine_id и т.д.
  • premium_subscriptions имеет идентификатор, magazine_id, user_id

Я хочу получить все подписки, к которым принадлежит указанный пользователь, а затем привязать к последнему столбцу, который указывает, является ли он (как в случае с идентификатором premium_subscription или нулем), пользователь является подписчиком премиум-класса.

Поэтому я думал, что первые две таблицы будут стандартным внутренним соединением на идентификаторе пользователя. Это получает все строки, которые я хочу, а затем другое соединение, которое хранит все те же строки, но получает идентификатор premium_subcription, если у пользователя есть отношения и null, если нет.

Возможно ли это с одним запросом?

+0

I предложите также посмотреть здесь: http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins –

ответ

1

Похоже, вы были довольно близки, вот рабочий запрос:

SELECT u.first_name, 
     u.last_name, 
     s.magazine_id, 
     ps.id 
    FROM users u 
    JOIN subscriptions s 
    ON u.id = s.user_id 
    LEFT JOIN premium_subscriptions ps 
    ON s.user_id = ps.user_id AND s.magazine_id = ps.magazine_id 

И SQL Скрипки, если вы хотите поиграть с ним: http://sqlfiddle.com/#!9/e5e58/6

+0

Очень тщательный, с полезной скрипкой. Благодаря! Неважным лакомым кусочком является получение указанного пользователя, который добавит предложение where в конце u.id = [id] – Oranjoose

1

Уверенный, что это возможно, он называется левым соединением.

SELECT * FROM users AS u 
    JOIN subscriptions AS s ON s.id=u.user_id 
    LEFT JOIN premium_subscriptions AS p 
     ON p.user_id=s.user_id AND p.magazine_id=s.magazine_id 

Левое соединение возвращает NULL для каждого запрашиваемого столбца объединенной таблицы в случае, если нет совпадения.

1

Вы можете сделать это с помощью LEFT JOIN и заявления CASE. Что-то вроде ниже должно работать:

SELECT u.id, 
     u.first_name, 
     u.last_name, 
     s.magazine_id, 
     CASE 
     WHEN ps.id is null 
     THEN 'No' 
     ELSE 'Yes' 
     END as Premium_Subscriber 
FROM users u 
INNER JOIN subscriptions s 
ON u.id=s.user_id 
LEFT JOIN premium_subscriptions ps 
ON ps.id=u.id 
AND ps.user_id=s.user_id 
AND ps.magazine_id=s.magazine_id 
Смежные вопросы