Проблема с SQL-запросом для потока / канала активности - PullRequest
0 голосов
/ 16 ноября 2011

Я создаю приложение, которое позволяет пользователям рекомендовать музыку друг другу, и у меня возникают проблемы при создании запроса, который бы возвращал «поток» рекомендаций, которые касаются как самого пользователя, так и любого из его друзей. , Это моя структура таблицы:

Рекомендации

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, но я заблудился, как поступить, и искал помощи в этом. (А также, если кто-то увидит какие-либо области для улучшения в моем текущем запросе, я весь в ушах.)

Спасибо!

1 Ответ

0 голосов
/ 18 ноября 2011

Хорошо, поверь, я понял это.Пришлось создать 2 псевдонима таблицы пользователей, чтобы я мог вытащить из каждого.Вот рабочий запрос:

SELECT recommendations.*, user1.firstname AS 'senderFirstName', user1.lastname AS 'senderLastName', user2.firstname AS 'recipientFirstName', user2.lastname AS 'recipientLastName'
FROM (recommendations, users)
INNER JOIN users AS user1 ON (user1.id=recommendations.sender)
INNER JOIN users AS user2 ON (user2.id=recommendations.recipient)
WHERE recommendations.sender IN (SELECT sender FROM relationships WHERE recipient='4' AND status='accepted' UNION SELECT recipient FROM relationships WHERE sender='4' AND status='accepted') OR recommendations.recipient IN (SELECT sender FROM relationships WHERE recipient='4' AND status='accepted' UNION SELECT recipient FROM relationships WHERE sender='4' AND status='accepted')
UNION
SELECT recommendations.*, user1.firstname AS 'senderFirstName', user1.lastname AS 'senderLastName', user2.firstname AS 'recipientFirstName', user2.lastname AS 'recipientLastName'
FROM (recommendations, users)
INNER JOIN users AS user1 ON (user1.id=recommendations.sender)
INNER JOIN users AS user2 ON (user2.id=recommendations.recipient)
WHERE recommendations.sender='4' OR recommendations.recipient='4'
GROUP BY recommendations.id
ORDER BY date created DESC

Если кто-нибудь увидит какие-либо ошибки или возможности для улучшения, я буду признателен за любой совет.

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