#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-подобные фреймворки, они слишком ограничивают.