【问题标题】:SQL Friendship tablestructure and queryingSQL Friendship 表结构和查询
【发布时间】:2013-04-17 13:03:25
【问题描述】:

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) 尚未处理邀请。接受/拒绝又名 1/0

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

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

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

我使用的表格是: 用户列:用户 ID 友谊列: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 

【问题讨论】:

  • 2 columns is inserted. 你的意思是在每个好友请求的表中插入两行吗?
  • 是的,对不起。当然是它的行。

标签: sql database


【解决方案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

【讨论】:

  • 天啊。我自己也搞不清楚 :( 非常感谢。希望这个线程能帮助另一个 SQL 菜鸟。真的很感激!谢谢 msmucker0527。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多