sql查询以通过电子邮件获取用户列表

时间:2019-01-11 15:27:27

标签: mysql sql

我有如下所示的示例数据,这里的问题是如何根据提供的输入电子邮件查找朋友电子邮件

| users                              |
| user_id | email                    |
|---------|--------------------------|
| 1       | ashutosh8657@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             |

示例1:假设,如果我提供以下输入作为电子邮件:

john@example.com

然后我的预期输出应该是这个(顺序无关紧要):

andy@example.com 
jetli@example.com
Kanchhi@example.com
maya@example.com 

在这里,在user_relations表john@example.com中,其userId为7,对于userId 7,您可以看到朋友为UserIds 4,6,2,5,因此我需要4,6的电子邮件地址,2,5

如果friend_status的值为1,则仅考虑为朋友,否则为1的朋友不是恶魔。我已经尝试过此查询,但结果为零。请帮助

SELECT 
case when u.user_id = r.receiver_user_id then requestor.email else receiver.email end as friend_email
FROM users u
JOIN user_relations r 
  ON (r.requestor_user_id = u.user_id OR r.receiver_user_id = u.user_id)
 AND r.friend_status = 1 
LEFT JOIN users requestor ON requestor.user_id = r.requestor_user_id
LEFT JOIN users receiver ON receiver.user_id = r.receiver_user_id
WHERE u.email in ('john@example.com') 
GROUP BY friend_email
HAVING COUNT(DISTINCT u.user_id) > 1

2 个答案:

答案 0 :(得分:1)

您执行的2次连接是没有用的,这是您应该重写查询的方式,我认为,您不在乎好友是接收者还是请求者:

Friend

答案 1 :(得分:1)

您可以使用它。

SELECT 
    FR.user_id,
    FR.friend_id,
    UR.email
FROM
(
SELECT requestor_user_id as user_id, receiver_user_id as friend_id,friend_status FROM user_relations  UR1 WHERE friend_status=1
UNION 
SELECT receiver_user_id as user_id, requestor_user_id as friend_id,friend_status FROM user_relations  UR1 WHERE friend_status=1
) FR 
INNER JOIN  users UR ON( FR.friend_id = UR.user_id)   
WHERE
 FR.user_id = (SELECT user_id FROM users WHERE email ='john@example.com')

SQL Fiddle