оператор select join n’ stuff

#c# #.net #sql #sql-server

#c# #.net #sql #sql-сервер

Вопрос:

 SELECT *
FROM LiveStreams l 
INNER JOIN Friendships f ON f.Sender = l.Sender 
                         OR f.Sender = l.Recipient 
                         OR f.Recipient = l.Sender 
                         OR f.Recipient = l.Recipient 
WHERE l.Sender = @SomeUser OR l.Recipient = @SomeUser 
  

Моя попытка на данный момент ^

Итак, что я пытаюсь здесь сделать, так это получить все потоки из (таблицы прямых трансляций) всех друзей данного @SomeUser. Мы можем узнать друзей, используя этот запрос:

 SELECT 
  Id, 
  CASE
    WHEN Sender = @UserName THEN Recipient 
    ELSE Sender 
  END AS Friend, 
  IsPending, 
  DateTime 
FROM Friendships 
WHERE (Sender = @UserName 
OR Recipient = @UserName) 
AND IsPending = @IsPending;
  

Учитывая @SomeUser, я хотел бы найти его / ее друзей из таблицы Friendships, имеющей 3 столбца (идентификатор, отправитель, получатель), используя одну строку (где друг может быть либо отправителем, либо получателем) Я хотел бы получить всех друзей, а затем получить их специальный поток из таблицы прямых трансляций (идентификатор, значение, отправитель, получатель)

Вроде как в Ленте новостей Facebook, когда @Person переходит на страницы прямых трансляций, мы будем искать все потоки, поступающие только от его друзей. Если его друзья ИНИЦИИРОВАЛИ поток или были отправлены потоком, чтобы они тоже могли быть в любом столбце.. Отправитель или получатель.

Как этого можно достичь? Ты

Как я могу это сделать?

**

Обновить:

**

Спасибо за ответы.

 SELECT l.* LiveStreams l 
INNER JOIN Friendships f ON f.Sender = 'beta' OR f.Recipient = 'beta'
WHERE l.Sender = 'beta' OR l.Recipient = 'beta' OR 
   l.Sender = f.Recipient OR l.Sender = f.Sender OR 
   l.Recipient = f.Sender OR l.Recipient = f.Recipient 
  

Что не работает в этом, так это то, что он по-прежнему показывает каналы, где бета является либо отправителем потока, либо получателем, чего я не хочу, потому что он сам себе не друг.
есть ли исправление? Еще раз спасибо.

Я не знаю, помогает ли это, но именно так я получаю список друзей кого-то..

     "SELECT foo.* "  
    "FROM (SELECT Id, Sender, CASE "  
    "WHEN Sender = @UserName THEN Recipient "  
    "ELSE Sender "  
    "END AS UserName, IsPending, DateTime "  
    "FROM Friendships WHERE "  
    "Sender = @UserName "  
    "or Recipient = @UserName "  
    ") as foo "  
    "where foo.UserName = @FriendName;";
  

Комментарии:

1. Почему у прямых трансляций есть один получатель? И означает ли один получатель, что только этот получатель должен иметь возможность просматривать поток?

2. Я сохраняю прямые трансляции, когда какой-либо пользователь публикует комментарий на чужой стене.. итак, отправитель — это отправитель, а получатель — получатель, затем, когда какой-либо другой пользователь входит на страницу прямого эфира, я бы хотел отфильтровать его друзей из таблицы прямого эфира (друзья могут быть отправителями или получателями) и отобразить значение и идентификатор прямого эфира. 🙂

3. Разве «бета» не может видеть свои собственные потоки? Я добавил новое предложение…

Ответ №1:

Это должно выполнить работу:

 SELECT l.* FROM LiveStreams l
INNER JOIN FriendShips f ON f.Sender = @SomeUser OR f.Recipient = @SomeUser
WHERE l.Sender = @SomeUser OR l.Recipient = @SomeUser OR
   l.Sender = f.Recipient OR l.Sender = f.Sender OR
   l.recipient = f.sender OR l.recipient = f.recipient
  

Если пользователь должен видеть ТОЛЬКО потоки друзей:

 SELECT l.* FROM LiveStreams l
INNER JOIN FriendShips f ON f.Sender = @SomeUser OR f.Recipient = @SomeUser
WHERE l.Sender <> @SomeUser AND l.Recipient <> @SomeUser AND (
   l.Sender = f.Recipient OR l.Sender = f.Sender OR
   l.recipient = f.sender OR l.recipient = f.recipient
)
  

Комментарии:

1. Я буду, но я отредактировал свой исходный пост, если вы могли бы взглянуть? Спасибо.

Ответ №2:

 SELECT l.* 
FROM LiveStreams l  
INNER JOIN (
  SELECT  
    f2.Id,  
    CASE WHEN f2.Sender = @UserName 
         THEN f2.Recipient  
         ELSE f2.Sender END AS Friend,  
    f2.IsPending,  
    f2.DateTime  
  FROM Friendships f2 
  WHERE (@UserName IN (f2.Sender, f2.Recipient))  
  AND f2.IsPending = @IsPending) f ON 
                         (f.Sender    IN (l.Sender, l.Recipient)
                       OR f.Recipient IN (l.Sender, l.Recipient))  
WHERE @SomeUser IN (l.Sender, l.Recipient)    
  

Комментарии:

1. Эй, Йохан, спасибо за ответ, но это дает мне: сообщение 207, сообщение 207, уровень 16, состояние 1, строка 14 Недопустимое имя столбца «Отправитель». Сообщение 207, уровень 16, состояние 1, строка 14 Недопустимое имя столбца «Отправитель». Сообщение 207, уровень 16, состояние 1, строка 15 Недопустимое имя столбца «Получатель». Сообщение 207, уровень 16, состояние 1, строка 15 Недопустимое имя столбца «Получатель».

2. @user1027620, Zend не любит подзапросы. Мне никогда не нравились zend-подобные фреймворки, они слишком ограничивают.