Запутался в довольно сложном запросе LEFT / RIGHT JOIN - PullRequest
1 голос
/ 24 июня 2011

спасибо, что нашли время, чтобы прочитать это.

По сути у меня есть 3 таблицы. Посты, Подписки, Художники. То, что я пытаюсь сделать, это вытянуть все «сообщения» из «Исполнителей», за которыми «следит» пользователь. Я передаю user_id и пытаюсь получить данные из 'Posts' и 'Artists'

Posts /* the posts table */
id
body
artist_id
timecode

Follows /* the follows table */
id
artist_id
user_id

Artists /* the artists table */
id
name

Итак, мой основной запрос начинается так:

SELECT Posts.id,Posts.body,Posts.timecode,Artists.id AS artist_id,Artists.name
FROM Posts,Artists
LEFT JOIN Artists
ON Posts.artist_id = Artists.id

Теперь я начинаю путаться. Я предполагаю, что мне нужен еще один оператор JOIN для таблицы «Follows», чтобы я ограничил возвращаемые результаты строками, имеющими запись «follow» с user_id и artist_id.

есть:

RIGHT JOIN Follows
ON Posts.artist_id = Follows.artist_id
WHERE Follows.user_id = :userid

Моя проблема в том, что я даже не знаю, как правильно написать это, хотя я чувствую, что нахожусь на правильном пути ... Сорта

Любая помощь будет высоко ценится !!! Спасибо.

РЕДАКТИРОВАТЬ Обратите внимание, что я извлекаю данные из таблиц сообщений и исполнителей, а не из таблицы сообщений. Не уверен, что это имеет большое значение.

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Я не вижу необходимости внешнего соединения, стандартные внутренние соединения SQL должны возвращать желаемый набор.Вы должны доверять SQL, чтобы найти все интересующие вас строки.

SELECT
  p.*
FROM
  posts p,
  artists a,
  follows f
WHERE
  f.user_id = :userid AND
  a.id = f.artist_id AND
  p.artist_id = a.id
;
1 голос
/ 24 июня 2011
SELECT p.id,p.body,p.timecode,a.id AS artist_id,a.name
FROM Posts p
INNER JOIN Follows f ON p.artist_id = f.artist_id
INNER JOIN Artists a ON f.artist_id = a.id
WHERE f.user_id = X

Синтаксис не проверен, надеюсь, все в порядке.

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