mysql - sql查询根据email获取好友
问题描述
我有看起来像这样的示例数据
| users |
| user_id | email |
|---------|--------------------------|
| 1 | test@example.com |
| 2 | Kanchhi@example.com |
| 3 | modi@example.com |
| 4 | andy@example.com |
| 5 | maya@example.com |
| 6 | jetli@example.com |
| 7 | john@example.com |
| user_relations |
| user_relation_id | requestor_user_id | receiver_user_id | friend_status |
|------------------|-------------------|------------------|---------------|
| 1 | 2 | 4 | 1 |
| 2 | 2 | 6 | 1 |
| 3 | 2 | 7 | 1 |
| 4 | 5 | 2 | NULL |
| 5 | 5 | 7 | NULL |
| 6 | 7 | 2 | NULL |
| 7 | 7 | 4 | 1 |
| 8 | 7 | 5 | 1 |
| 9 | 7 | 6 | 1 |
| 10 | 4 | 2 | 1 |
| 11 | 4 | 3 | 1 |
| 12 | 4 | 5 | 1 |
| 13 | 4 | 6 | 1 |
| 14 | 4 | 7 | 1 |
如果输入是这两封电子邮件:
Kanchhi@example.com, john@example.com
然后我预期的预期输出是这样的(顺序无关紧要):
andy@example.com
jetli@example.com
在上面的示例中,用户 id 2 的朋友是用户 id (4, 6, 7),用户 id 7 的朋友是用户 id (2, 4, 5, 6)。所以用户 id 2 和 7 的共同朋友是4 和 6。我需要共同用户 ID 的电子邮件地址。
另一个示例输入是:
andy@example.com, john@example.com
然后预期的输出是这样的:
jetli@example.com
Kanchhi@example.com
maya@example.com`
在上面的例子中,用户 id 4 的朋友是 (2, 6, 5, 3, 2),用户 id 7 的朋友是 (6, 5, 2, 4)。所以共同朋友的用户 id 将是2, 6, 5。我需要输出中这些用户 ID 的电子邮件地址。
查询 1- 我试过但得到错误的结果:
SELECT u.email
FROM user_relations r
LEFT JOIN users u ON r.requestor_user_id = u.user_id
LEFT JOIN users z ON r.receiver_user_id = z.user_id
where u.email in ('Kanchhi@example.com','john@example.com') or
z.email in ('Kanchhi@example.com','john@example.com')
and r.friend_status = 1
group by u.email
having count(u.email ) > 1
结果-但不正确:
| email |
|---------------------|
| andy@example.com |
| john@example.com |
| Kanchhi@example.com |
如何得到这个?
解决方案
问题的关键在于建立一个用户列表,这些用户是 Kanchi 和 John 的朋友,或者他们是朋友。然后计算那些出现在列表中两次的用户:
-- SELECT email FROM users WHERE userid IN (
SELECT friendid
FROM (
SELECT requestor_user_id AS userid, receiver_user_id AS friendid
FROM user_relations
WHERE friend_status = 1 AND requestor_user_id IN (
SELECT user_id
FROM users
WHERE email IN ('Kanchhi@example.com','john@example.com')
)
UNION ALL
SELECT receiver_user_id, requestor_user_id
FROM user_relations
WHERE friend_status = 1 AND receiver_user_id IN (
SELECT user_id
FROM users
WHERE email IN ('Kanchhi@example.com','john@example.com')
)
) AS X
GROUP BY friendid
HAVING COUNT(DISTINCT userid) = 2
将结果与用户匹配是微不足道的。对于您的样本输入,结果是:
4 Andy andy@example.com ashutosh 2019-01-11 13:34:05
6 jetli jetli@example.com ashutosh 2019-01-11 13:34:05
推荐阅读
- javascript - 关于部署前端项目的困惑
- maven - Sonatype Nexus: Hide Uploader's IP Address
- java - How to store some text in a ms word file in a specific format using java or php?
- python-3.x - 如何创建一个仅包含具有特定形状的 inf 的数组?
- python - 如何防止在python退出时在bash中执行按键
- python - Django 架构:我应该在哪里为所有用户安排 Celery Beat 定期任务?
- javascript - 如何使过渡“出现”在第二次加载而不是初始加载时工作
- http - 为什么这个 go http 服务器在多次请求后停止响应?
- r - 如何查找子字符串是否包含在列表中?
- node.js - 无法在同一个 postgres 连接中读取('select')和写入('update')?