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
答案 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