Выбор событий друга пользователя - PullRequest
1 голос
/ 25 июля 2010

У меня есть эти данные:
Таблица «Пользователи» =>

 **Id**     **Name** 
   1           a
   2           b
   3           c
   4           d
   5           e

Таблица «Друзья» =>

**SenderId**  **ReceiverId**    **State**
     1              2              x 
     2              3              ok 
     3              1              ok
     3              4              ok
     5              3              ok 
     5              4              ok

Таблица «События» =>

     **SenderId**    **receiverId**     **text**
 1        1                3              ssss
 2        3                1             dsadsa
 3        2                3             safsdf
 4        3                5              fgfdgfd
 5        4                3             fgfhgfh
 6        5                4              sad sad

Мой вопрос заключается в том, как получить события друзей пользователя в одном выражении sql, используя только JOINS.

, например: =>

  • userId: 1
  • его друзья: 3 (состояние = нормально)
  • события друзей: 1, 2, 3, 4, 5 (события с 1 по 5 имеют userId 3, который считается другом пользователя1)

ЛЮБАЯ ПОМОЩЬ .. СПАСИБО;) !!

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Вы не указали имя для первого столбца в своей таблице Events, поэтому я назвал его row_ID:

SELECT U1.ID AS user_ID, U1.Name AS user_name, 
       U2.ID AS friend_user_ID, U2.Name AS friend_user_name, 
       E1.row_ID, E1.text AS event_text
  FROM Users AS U1
       INNER JOIN Friends AS F1
          ON (
              U1.ID = F1.ReceiverId
              OR U1.ID = F1.SenderId
             )
             AND F1.State = 'ok'
       INNER JOIN Users AS U2
          ON U2.ID = F1.SenderId
       INNER JOIN Events AS E1
          ON (
              U2.ID = E1.ReceiverId
              OR U2.ID = E1.senderId
             )
 WHERE U1.ID = 1;
0 голосов
/ 25 июля 2010

Это довольно просто с подзапросом.

Вот подзапрос (найти друзей пользователя 1)

SELECT
   senderID
FROM
   friends
WHERE
   receiverID = 1

Вот основной запрос (найти события друга пользователя 1)

SELECT
   primary_key,
   senderID,
   receiverID,
   text
FROM
   events
WHERE
      senderID IN (subquery) --events where user1's friends were the senders
   OR receiverID IN (subquery) --events where user1's friend's were the receivers

Соберите все вместе:

SELECT
   *
FROM
   events
WHERE
      senderID IN (SELECT
                      senderID
                   FROM
                      friends
                   WHERE
                      senderID = 1) --events where user1's friends were the senders
   OR receiverID IN (SELECT
                      senderID
                   FROM
                      friends
                   WHERE
                      receiverID = 1) --events where user1's friend's were the receivers

Возможно, вы захотите заменить явное '1' на переменную, чтобы вы могли выполнить этот запрос для каждого пользователя.

Удачи

0 голосов
/ 25 июля 2010

Ваша структура таблиц довольно запутана со всеми этими идентификаторами отправителя и получателя, но я думаю, что следующий запрос будет работать.

SELECT * FROM
(SELECT Users.Name, Events.text 
   FROM Users  
   LEFT JOIN Friends ON Users.Id = Friends.ReceiverId 
   LEFT JOIN Events ON Friends.SenderId = Events.SenderId 
   WHERE Users.Id = 1)
UNION ALL
(SELECT Users.Name, Events.text 
   FROM Users 
   LEFT JOIN Friends ON Users.Id = Friends.ReceiverId 
   LEFT JOIN Events ON Friends.SenderId = Events.ReceiverId 
   WHERE Users.Id = 1)

Вероятно, вы можете упростить это, но я не уверен, как, учитывая, что вы хотите выбрать события 1-5, потому что идентификатор друга может быть либо Events.SenderId, либо Events.ReceiverId.

Я не знаю, поддерживает ли это SQL, но, возможно, поместите OR в предложение LEFT JOIN (?):

SELECT Users.Name, Events.text 
  FROM Users 
  LEFT JOIN Friends ON Users.Id = Friends.ReceiverId 
  LEFT JOIN Events ON (Friends.SenderId = Events.SenderId OR Friends.SenderId  = Events.ReceiverId) 
  WHERE Users.Id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...