4

I have a twiter-like web, where users follow another users, I need to show them suggestions to follow new people

TABLE USERS

user id_user
A       1
B       2
C       3
D       4
E       5
F       6

TABLE COMMUNITY

id_follower id_followed
3               4
3               5
3               6

3 (C) follows to 4,5,6 (D,E,F)

I got the statement of showing the followed users, 4,5,6 (D,E,F):

SELECT user,id_followed
  FROM users,community
    WHERE users.id_user=community.id_followed AND community.id_follower=3
        GROUP BY user

How do I show the users that arent followed by C(3), in other words 1,2 (A,B)

Do I need an EXCEPT? LEFT OUTER JOIN?

SELECT id_followed
   FROM community
    EXCEPT
      (
        SELECT user,id_followed
           FROM users,community
                WHERE users.id_user=community.id_followed AND community.id_follower=3
        GROUP BY user
     )

    RETRIEVE ERROR.
JJJ
  • 32,902
  • 20
  • 89
  • 102
masterhoo
  • 89
  • 8

3 Answers3

3

you can use NOT EXISTS

SELECT *
   FROM users u
WHERE NOT EXISTS
      (
        SELECT *
           FROM community c
                WHERE c.id_follower=3
            AND ( u.id_user = c.id_followed or u.id_user = c.id_follower)
     )

sql fiddle

Serkan Arslan
  • 13,158
  • 4
  • 29
  • 44
0

Simple way is to use the minus operator. It would look something like:

SELECT id_user
 FROM users
MINUS
SELECT id_followed
 FROM community
 WHERE community.id_follower=3
Egret
  • 739
  • 3
  • 8
0

what you are trying to do can be achieved by using "not in" clause try the following query to achieve your goal

SELECT * 
FROM 
   users
WHERE 
   id_user not in 
        (SELECT 
            id_followed 
         FROM 
            community 
        WHERE 
            id_follower = 3)
AND 
    id_user <> 3
Khan M
  • 415
  • 3
  • 17