Dan
Dan

Reputation: 2174

sql query to get the list of user by email

I have sample data that looks like below, Here my question is how to find friends email based on provided input email

| users                              |
| user_id | email                    |
|---------|--------------------------|
| 1       | [email protected] |
| 2       | [email protected]      |
| 3       | [email protected]         |
| 4       | [email protected]         |
| 5       | [email protected]         |
| 6       | [email protected]        |
| 7       | [email protected]         |

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

Example1: Suppose, If i provide below input as email:

[email protected]

Then my expected output should be this (order does not matter):

[email protected] 
[email protected]
[email protected]
[email protected] 

Here, in user_relations table [email protected] its userId is 7 and for userId 7, you can see friends are UserIds 4,6,2,5 , Hence i need the email address of 4,6,2,5

Only consider friend if friend_status has value 1, other then 1 they are not fiend. I have tried this query but giving zero result. Please help

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 ('[email protected]') 
GROUP BY friend_email
HAVING COUNT(DISTINCT u.user_id) > 1

Upvotes: 4

Views: 2445

Answers (2)

Daniel E.
Daniel E.

Reputation: 2480

You are doing 2 join wich are useless, here is how you should rewrite your query, in my opinion, you don't care if the friends are receiver or requestor :

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 ='[email protected]'
      AND r.friend_status = 1 

Upvotes: 1

Uttam Kumar Roy
Uttam Kumar Roy

Reputation: 2058

You can use this.

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 ='[email protected]')

SQL Fiddle

Upvotes: 1

Related Questions