SQL запрос, чтобы получить список пользователей по электронной почте - PullRequest
0 голосов
/ 11 января 2019

У меня есть пример данных, который выглядит ниже

| 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 голосов
/ 11 января 2019

Вы можете использовать это.

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

0 голосов
/ 11 января 2019

Вы делаете 2 присоединения, которые бесполезны, вот как вы должны переписать свой запрос, на мой взгляд, вам все равно, являются ли друзья получателем или запросчиком:

SELECT DISTINCT
 u2.email as friend_email
FROM users u
INNER JOIN user_relations r 
  ON (r.requestor_user_id = u.user_id OR r.receiver_user_id = u.user_id) 
INNER JOIN users u2
 ON (r.requestor_user_id = u2.user_id OR r.receiver_user_id = u2.user_id)
     AND u2.user_id <> u.user_id
WHERE u.email ='andy@example.com'
      AND r.friend_status = 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...