SQL友谊表结构和查询

时间:2013-04-17 13:03:26

标签: sql database

SQL问题:

我对表格中的更改持开放态度。如果我应该添加一个FriendshipRequest tbl,或者IsActive足以收集所需的信息。或者,如果我应该使用状态:待定,接受,拒绝等等。

获得表用户和表友谊。

对于每个有朋友或朋友未决的用户,无论是他自己还是自己,都会插入2行。

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

^ 在这里,我们有一位朋友从UID到FID。 邀请已被接受,他们是朋友。

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

^ 在这里,我们有一个待处理的邀请,来自UID 1> 2为了友谊。 其他用户(UID:2)尚未处理邀请。接受/拒绝aka 1/0

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

^ 在这里,我们收到了拒绝请求。 ID为2的用户拒绝了邀请。将两列设置为False / 0。

问题是,我想为以下内容编写查询:     获取所有待处理的请求(IsActive 1和IsActive = 0)     获取特定用户的所有朋友(Active Friends IsActive = 1)

我使用的表是:     用户列:UserID     友谊COlumns:UserID,FriendID,IsActive

我尝试了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 

1 个答案:

答案 0 :(得分: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