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

问题描述 投票:1回答:2

我有一张桌子Follow,它只保存UserID跟随哪个TargetID的记录。

如果要求用户A:

  • 如果A或B都没有相互跟随,则它们的状态为qazxsw poi,不相关,并且不包括在结果中。
  • 如果用户A跟随B但反之亦然,则B具有状态0以便跟随。
  • 如果用户B跟随A但反之亦然,则B具有状态1作为关注者。
  • 如果A跟随B,而B跟随A,则B具有2状态作为朋友。

如何在单个MySQL查询中获取给定用户及其状态0以上的所有关系的关系状态?

例:

3
mysql
2个回答
2
投票

您可以使用子查询,如下所示:

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

-- 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;


0
投票

我没有试过这个,但尝试以下几行:

DEMO on SQL Fiddle
  1. 内部联接以选择用户1的关系(如果它不存在,则它们不相关)
  2. 如果有记录,则表示他们是3中的一个:
© www.soinside.com 2019 - 2024. All rights reserved.