mysql - 查找常见的匹配 ID

标签 mysql sql select group-by having

我有一张表(见下文),其中包含 friend 列表。在每一行中,用户可以是发送者或接收者(请求者/被请求者)。然后状态会跟踪他们的关系(状态为 1 表示他们是 friend )。但是因为 uid 可以在发送者或接收者中,这让我很困惑。

================================
| sender   | reciever | status |
--------------------------------
| testusr1 | testusr2 | 1      |
| testusr1 | testusr3 | 1      |
| testusr1 | testusr4 | 0      |
| testusr1 | testusr5 | 1      |
| testusr3 | testusr4 | 1      |
| testusr3 | testusr2 | 1      |
| testusr5 | testusr3 | 1      |

所以在上面的例子中,testusr1的好友是:testusr2、testusr3、testusr5。 testusr3的好友是:testusr5、testusr4、testusr2、testusr1

我正在寻找的是一个将获得共同 friend 的查询:testusr2 和 testusr5

从我在这里得到的另一个答案中寻找答案,我想我可以做一个联合,但我失去了我在中途遵循的逻辑......

SELECT f.uid
    FROM(
        (SELECT reciever as uid FROM friends where status=1 and sender='$sentuid')
        UNION 
        (SELECT sender as uid FROM friends where status=1 and reciever='$sentuid')
    ) f
    WHERE ...

任何帮助将不胜感激......

最佳答案

尝试类似 - (edited)

SELECT f.uid
FROM (
     SELECT f1.reciever as uid FROM friends f1
     WHERE f1.sender = USER1 AND f1.status = 1
     UNION
     SELECT f2.sender as uid FROM friends f2
     WHERE f2.reciever = USER1 AND f2.status = 1
    ) f
WHERE f.uid IN (
     SELECT f3.reciever as uid FROM friends f3
     WHERE f3.sender = USER3 AND f3.status = 1 AND f3.reciever != USER1
     UNION
     SELECT f4.sender as uid FROM friends f4
     WHERE f4.reciever = USER3 AND f4.status = 1 AND f4.sender != USER1
    );

USER1USER3 替换为您想要找到共同 friend 的 2 个用户 ID

sqlfiddle 示例 - http://sqlfiddle.com/#!2/b0aaf4/8

关于mysql - 查找常见的匹配 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27307259/

相关文章:

sql - 标量函数中的 CTE

mysql - 如何通过 select 查询从 mysql 表字段返回字符串的一部分?

SQL:如何从单个列中选择满足多个条件的单个 id ("row")

mysql - Rails 最佳实践 : Constants for model ids, 或 find_by 或 where 查询?

mysql - 左连接对不匹配的行进行计数给出了错误的计数

java - mysql-connector-java 升级到 8.0.11 会更改从数据库中检索到的所有日期值

sql - 按组限制结果集

mysql - 查询mysql表从两个表的外键创建复合主键

php - 想找出从 mysql 返回的结果总数

sql - 检索客户的最后一个挂单