刚好最近在学习postgresql,就来解答一下
LZ这样的 没有表结构, 怎么回答?
那我就来假设吧:
如果是经典的关系表:
那么你会有两个表, user 和 friends,
user 记录用户, friends 记录好友关系
mydb=# \d user
Table "public.user"
Column | Type | Modifiers
--------+---------+-----------
id | integer
mydb=# \d friends
Table "public.friends"
Column | Type | Modifiers
--------+---------+-----------
u1 | integer |
u2 | integer |
mydb=# select * from user ;
id
----
1
2
3
4
5
6
(6 rows)
mydb=# select * from friends ;
u1 | u2
----+----
1 | 3
1 | 6
(2 rows)
假设
user.id = 1 的是A用户, 他有两个好友,id为3,6
SQL:
mydb=# select id from user, (select array_agg(u2) as friend from friends where u1 = 1) as f where not (id = any(f.friend));
id
----
1
2
4
5
(4 rows)
如果是单向好友,那么完全可以不要friends表, 把好友用array类型存储起来
mydb=# \d s_user
Table "public.s_user"
Column | Type | Modifiers
---------+-----------+-----------
id | integer |
friends | integer[] |
mydb=# select * from s_user ;
id | friends
----+---------
2 |
3 |
4 |
5 |
6 |
1 | {3,6}
(6 rows)
mydb=# select
u1.id from s_user u1, s_user u2 where
u2.id = 1 and not (
u1.id = any(u2.friends));
id
----
2
4
5
1
(4 rows)