SQL. Запутанное соединение между двумя таблицами - PullRequest
0 голосов
/ 21 марта 2012

У меня есть 2 таблицы: пользователи и подписчики . Отношение пользователя к подписчику - многие-ко-многим .

пользователей таблицы http://s019.radikal.ru/i621/1203/5c/bbfa4d42e678.jpg

таблица подписчиков http://s018.radikal.ru/i522/1203/7b/e7e61e6ba26d.jpg

Я знаю, как получить всех пользователей:

SELECT * FROM users

И я также знаю, как получить подписчиков для данного пользователя по его идентификатору (например, id = 1):

SELECT * FROM users LEFT JOIN subscribers ON id = user_id WHERE user_id = 1 

Но мне нужны эти результаты не отдельно, а вместе.

То есть я хочу создать запрос для получения всех пользователей . Но в дополнение к их свойствам результат запроса должен содержать свойство , которое показывает, что каждый пользователь является подписчиком или нет. Примерно так:

стол подписчиков http://s019.radikal.ru/i622/1203/02/56eaf26cc442.jpg

И, конечно же, я бы хотел избежать использования подзапросов. Было бы здорово использовать только JOIN. Если это возможно,

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Вы можете сделать:

SELECT u.*, 
        CASE WHEN s.user_id IS NULL THEN 'false' ELSE 'true' END as IsSubscriber 
FROM users u 
   LEFT JOIN subscribers s ON u.id = s.user_id

..., поскольку s.user_id будет сделано null с помощью left join, когда пользователь отсутствует в таблице subscribers.

0 голосов
/ 21 марта 2012
SELECT users.id, users.firstname, users.lastname, COUNT(subscribers.user_id) != 0 AS isSubscriber
  FROM users
  LEFT JOIN subscribers ON users.id = subscribers.user_id
  GROUP BY users.id, users.firstname, users.lastname
0 голосов
/ 21 марта 2012

Я обновил ваш запрос, чтобы получить то, что вы хотите.

SELECT u.id, u.firstName, u.lastname, WHEN s.user_id IS NULL 'false' else 'true' END as IsSubscriber.
FROM users u
LEFT JOIN subscribers s 
   ON u.id = s.user_id 
WHERE user_id = 1  
...