2013-04-17 3 views
2

SQL Проблема:SQL tablestructure Дружба и запрашивая

Я открыт для изменений в моих таблицах. Если я должен добавить тэг FriendshipRequest или если IsActive достаточно для сбора необходимой информации. Или, если мне нужно пойти со статусом: Ожидание, Принято, Отклонено и так далее.

Got table Пользователь и таблица Дружба.

Для каждого пользователя, у которого есть друзья или в ожидании дружбы, либо от себя, либо от себя, вставлены 2 строки.

| UID | FID | IsActive | 
| 1 | 2 | 1  | 
| 2 | 1 | 1  | 

^ Здесь мы получили один friendinvitation от UID к FID. Приглашение принято, и они являются друзьями.

| UID | FID | IsActive | 
| 1 | 2 | 1  | 
| 2 | 1 | 0  | 

^ Здесь мы получили один ожидающий приглашение от UID 1> 2 для дружбы. Другой пользователь (UID: 2) не обработал приглашение. Принять/Отклонить ака 1/0

| UID | FID | IsActive | 
| 1 | 2 | 0  | 
| 2 | 1 | 0  | 

^ Здесь мы получили отклоненный запрос. Пользователь с идентификатором 2 отклонил приглашение. Чтобы установить обе колонки в False/0.

Дело в том, что я хочу написать запросы для: Получение всех ожидающих запросов. (IsActive 1 и IsActive = 0) Получить все друг для конкретного пользователя (Active Друзья IsActive = 1)

Таблицы, которые я использую это: Столбцы Пользователя: Идентификатор_пользователь КОЛОННА Friendship: Идентификатор_пользователь, FriendID, IsActive

Ive попробовал UNION ALL, дело в том, что я не знаю, как справиться с результатом.

SELECT 
    u.UserID, u.Username, f.IsActive 
FROM Friendship f, [User] u 
    WHERE f.UserID = 6 AND f.FriendID = u.UserID AND f.IsActive = 1 

UNION ALL 

SELECT 
    u.UserID, u.UserName, f.IsActive 
FROM Friendship f, [User] u 
    WHERE f.FriendID = 6 AND f.UserID = u.UserID AND f.IsActive = 1 
+0

'2 столбца вставлены.' Вы имели в виду, что две строки вставляются в указанную таблицу для каждого запроса друга? – Ejaz

+0

Да, извините. Конечно, его ряды. – kmadh

ответ

1

Чтобы получить все ожидающие запросы вы можете присоединиться к таблице для себя, проверяя только один из них, чтобы быть активным. Эта установка предполагает, что IsActive является BIT, если вы сделали это целое число можно просуммировать их и проверить общий

SELECT * 
FROM Friendship f1 
JOIN Friendship f2 
    ON f1.FID = f2.UID 
    AND f1.UID = f2.FID 
WHERE ((f1.IsActive = 1 AND f2.IsActive = 0) 
OR (f1.IsActive = 0 AND f2.IsActive = 1)) 

И получить все активные вы можете сделать то же самое, но для конкретного пользователя, и где оба активны

SELECT * 
FROM Friendship f1 
JOIN Friendship f2 
    ON f1.FID = f2.UID 
    AND f1.UID = f2.FID 
WHERE f1.IsActive = 1 
AND f2.IsActive = 1 
AND f1.UID = 5 
+0

О, господин. И я не мог понять это сам :( Большое спасибо. Надеюсь, что эта нить поможет другому SQL noob. Очень ценю это! Спасибо msmucker0527. – kmadh

Смежные вопросы