在MySQL中,如何将一个表中的多个条目连接到一个关系状态中?
我有一个表Follow,它只保存UserID跟随TargetID的记录 如果要求用户A: 如果A或B都没有相互跟踪,则“不相关”的状态为0,并且不包括在结果中。 如果用户A跟随B,但不是相反,则B的状态为1 被跟踪。 如果用户B跟随A,但不是相反,则B已 作为追随者的状态2。 如果A跟在B后面,B跟在B后面 A、 作为朋友,B的状态为3。 如何在单个MySQL查询中获取给定用户的关系状态及其状态0以上的所有关系 例如:在MySQL中,如何将一个表中的多个条目连接到一个关系状态中?,mysql,Mysql,我有一个表Follow,它只保存UserID跟随TargetID的记录 如果要求用户A: 如果A或B都没有相互跟踪,则“不相关”的状态为0,并且不包括在结果中。 如果用户A跟随B,但不是相反,则B的状态为1 被跟踪。 如果用户B跟随A,但不是相反,则B已 作为追随者的状态2。 如果A跟在B后面,B跟在B后面 A、 作为朋友,B的状态为3。 如何在单个MySQL查询中获取给定用户的关系状态及其状态0以上的所有关系 例如: Users: +----+-------+ | id | Name | +
Users:
+----+-------+
| id | Name |
+----+-------+
| 1 | Bob |
| 2 | Steve |
| 3 | Scott |
| 4 | Mary |
+----+-------+
Follow:
+----+--------+----------+
| id | UserID | TargetID |
+----+--------+----------+
| 1 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 2 | 1 |
| 4 | 4 | 1 |
+----+--------+----------+
Expected result for user 1:
+----------+--------+-------+
| TargetID | Status | Name |
+----------+--------+-------+
| 2 | 3 | Steve | (friend)
| 3 | 1 | Scott | (following)
| 4 | 2 | Mary | (follower)
+----------+--------+-------+
我没有尝试过这一点,但尝试了以下几行:
Select t.targetid as TargetId,
IF (
(select count(id) from follow where
follow.Userid = f.target.id and follow.target_id = u.id) > 1,
-- mean’s the target is following user 1
(IF (
(select count(id) from follow where
follow.Userid = u.id and follow.target_id = f.targetid) > 1, 3, 2))
-- if user1 is following aswell, then its a friend, else its a follower
, 1)
-- else means its a following
as status,
u.name as Name from follow f
inner Join users u on u.id = f.targetid
where u.id = 1
内部连接以选择用户1的关系如果不存在,则它们不相关
如果有记录,则表示它们是以下三项之一:
您可以使用子查询,如下所示:
-- FOR USER 1
SELECT A.id TargetID,
SUM(IFNULL((SELECT 1 C FROM Follow B WHERE B.UserID=1 AND B.TargetID=A.id),0) +
IFNULL((SELECT 2 C FROM Follow D WHERE A.id=D.UserID AND D.TargetID=1), 0)) Status
, A.name
FROM (SELECT * FROM Users WHERE ID<>1) A
GROUP BY A.id, A.Name
HAVING Status>0; -- for a compact result
-- NOW GLOBALLY
SELECT A.UserID, A.id TargetID,
SUM(IFNULL((SELECT 1 C FROM Follow B WHERE B.UserID=A.UserID AND B.TargetID=A.id),0) +
IFNULL((SELECT 2 C FROM Follow D WHERE A.id=D.UserID AND D.TargetID=A.UserID), 0)) Status
, A.name
FROM (SELECT E.id UserID, F.* FROM Users E JOIN Users F ON E.id<>F.id) A
GROUP BY A.UserID, A.id, A.Name
HAVING Status>0 -- for a compact result
ORDER BY A.UserID;
请参见您能分享样本数据和预期输出列吗?添加了示例,以及可读性的用户名。对于每个样本,我相信Steve也应该是朋友。您是对的,现在应该是正确的。这给出了一个错误:以前发现了一个别名。位置401附近的状态“选择1 C”和“id”是什么意思?如果你有timeid,就意味着id不同于。选择1c只是一种返回1的方法,如果选择中的条件满足,我就用它来根据问题构造状态的值。非常感谢,还有额外的演示!这非常有效,除非我添加了更多没有任何关注的用户,他们显示为关系0,如何在结果中排除这些用户?请参阅:对于第一个查询仍然不起作用,请尝试将第五个用户添加到演示中,但不显示以下内容。对于特定于用户的查询,它将显示为0。将查询从我的答案复制并粘贴到演示并运行。