Я создаю приложение, которое позволяет пользователям рекомендовать музыку друг другу, и у меня возникают проблемы при создании запроса, который бы возвращал «поток» рекомендаций, которые касаются как самого пользователя, так и любого из его друзей. , Это моя структура таблицы:
Рекомендации
ID Sender Recipient [other columns...]
-- ------ --------- ------------------
r1 u1 u3 ...
r2 u3 u2 ...
r3 u4 u3 ...
Пользователи
ID Email First Name Last Name [other columns...]
--- ----- ---------- --------- ------------------
u1 ... ... ... ...
u2 ... ... ... ...
u3 ... ... ... ...
u4 ... ... ... ...
Отношения
* * 1010
Так что для пользователя «u4» (который дружит с «u1»), я хочу запросить «поток» рекомендаций, относящихся к u4. Этот поток будет включать все рекомендации, в которых отправителем или получателем является u4, а также все рекомендации, в которых отправителем или получателем является u1 (друг).
Это то, что у меня есть до сих пор для запроса:
SELECT * FROM recommendations
WHERE recommendations.sender IN
( SELECT sender FROM relationships WHERE recipient='u4' AND status='accepted'
UNION
SELECT recipient FROM relationships WHERE sender='u4' AND status='accepted')
OR recommendations.recipient IN
( SELECT sender FROM relationships WHERE recipient='u4' AND status='accepted'
UNION
SELECT recipient FROM relationships WHERE sender='u4' AND status='accepted')
UNION
SELECT * FROM recommendations
WHERE recommendations.sender='u4' OR recommendations.recipient='u4'
GROUP BY recommendations.id
ORDER BY datecreated DESC
Что, кажется, работает, насколько я вижу (я не эксперт по SQL). Он возвращает все записи из таблицы рекомендаций, которые были бы «релевантными» для данного пользователя. Однако теперь у меня возникают проблемы с получением данных из таблицы «Пользователи». Таблица рекомендаций содержит идентификатор отправителя и получателя (внешние ключи), но я также хотел бы получить имя и фамилию каждого из них. Я думаю, что мне нужно что-то вроде JOIN, но я заблудился, как поступить, и искал помощи в этом. (А также, если кто-то увидит какие-либо области для улучшения в моем текущем запросе, я весь в ушах.)
Спасибо!