Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中,如何将一个表中的多个条目连接到一个关系状态中?_Mysql - Fatal编程技术网

在MySQL中,如何将一个表中的多个条目连接到一个关系状态中?

在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 | +

我有一个表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  |
+----+-------+
|  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。将查询从我的答案复制并粘贴到演示并运行。