Я работаю над сайтом социальной сети, и мне нужны пользователи, чтобы иметь возможность дружить и / или блокировать друг друга. На мой взгляд, 2 пользователя могут быть Друг , В ожидании , Блок или NULL . Я хотел бы иметь одно представление, которое показывает одну строку для каждого подтвержденного отношения. Мое представление правильно показывает отношения, но мне пришлось сделать обходной путь, чтобы показать только 1 строку / отношение, не объединяя таблицу с самим собой и не меняя порядок или Запросчик и Запросчик.
У кого-нибудь есть идеи, как это почистить?
Спасибо,
- Грег
Таблица отношений:
Запросчик (int) | Запрашиваемая (int) | ApprovedTimestamp (smalldatetime) | IsBlock (бит)
vwRelationship View:
SELECT DISTINCT
CASE WHEN f.Requestor < f.Requestee THEN f.Requestor ELSE f.Requestee END AS UserA,
CASE WHEN f.Requestor < f.Requestee THEN f.Requestee ELSE f.Requestor END AS UserB, CASE WHEN b.Requestor IS NULL AND b.Requestee IS NULL
THEN CASE WHEN f.AcceptedTimestamp IS NULL THEN 'Pending' ELSE 'Friend' END ELSE 'Block' END AS Type
FROM dbo.Relationship AS f LEFT OUTER JOIN
(SELECT Requestor, Requestee
FROM dbo.Relationship
WHERE (IsBlock = 1)) AS b ON f.Requestor = b.Requestor AND f.Requestee = b.Requestee OR f.Requestor = b.Requestee AND f.Requestee = b.Requestor
Пример запроса:
Выбрать тип из vwRelationship Где (Пользователь A = 1 И Пользователь B = 2) ИЛИ (Пользователь A = 2 И Пользователь B = 1)
Сценарий:
- Пользователь 1 и Пользователь 2 не знают друг друга | Тип отношений = NULL
- Пользователь 1 друзей Пользователь 2 | Тип отношений = В ожидании
- Пользователь 2 принимает | Тип отношений = Друг
- через месяц Пользователь 2 блокирует Пользователь 1 | Тип отношений = Блок