回答

收藏

SQL获取用户的朋友和朋友的朋友

技术问答 技术问答 446 人阅读 | 0 人回复 | 2023-09-14

我的MySQL表结构是这样的。3 R  p* l6 g" E: i8 H+ O4 z
USER
% X/ k5 l2 J/ U; Wint id+ J5 L) S: M) ]
varchar username( T% r. Z2 l' n* [
FRIEND_LIST8 L& u, ~! a& c5 Q
int user_id; N8 R8 a& f: ~2 h
int friend_id, M5 ~, h5 c8 S$ }2 y
对于每个朋友关系,我在FRIEND_LIST中插入2条记录。如果用户1是用户2的朋友,则将下一行插入FRIEND_LIST% T: K; w% w& \5 f! w: }* G1 ?
1,2. a0 q6 \' j* i7 I( u
2,1; A/ v* K& x6 X: x0 Y3 h
我想结识特定用户的朋友和朋友的朋友。
% K; O6 n# f3 W1 f$ n, G选择应返回列a,b,c。
& F. I0 M2 ~$ P8 z: @a: user_id
; J3 M: M" u) {% Sb: friend_id# H4 [) q  G6 p' O6 O. W: r
c: username (username of friend_id )
6 g6 l& r4 ]4 S$ i% N9 d/ `If 1 is friend of 2 and 3.2 ~* c% ?0 [1 E2 ]0 B
2 is friend of 3, 4 and 5
5 l9 C0 K4 p* B# v& n3 is friend of 5,6,73 k1 n- J  ^7 C# P  X4 c* `! V& R& P2 Q
然后获取1的朋友和朋友的朋友的查询应返回:
! O1 Q; Z4 r& d- E8 Y1 2 two1 q5 o; q( J) C! P8 c9 E5 U
1 3 three
- Y9 t! H" i. {5 R7 l8 j9 O2 1 one
# d1 n! V' {3 c7 Y3 Q% S+ m  G9 @% h2 3 three
1 @* ~9 i  L& J- H: X( K9 F% R2 4 four
# ~, M8 W& s, ^: _4 Z* U# f9 w) T2 5 five
' H2 m$ @8 ?2 x5 d! |% n3 1 one
( _% ?5 t- W! P3 5 five
' L; m( ^, U9 B# m3 6 six  Z- [0 U: t% h# s5 [2 g% Y! V' H
3 7 seven# ]1 T* d0 S" e; F( k. i
我可以通过一个查询获得这些行吗?/ I$ Q7 s4 |5 U3 O* M% W- ~' x
更新答案: 我对DVK的答案做了一些修改,这是返回我所要查找内容的查询。( I" D% K- ?" `' U+ x
SELECT friends.user_id, friends.friend_id, username) o1 h; s* K) b! Y4 O, h
FROM4 N4 o& n, t+ T  G% k- ?3 S4 s# @
      FRIEND_LIST friends, USER
# J0 v0 z& o% U) sWHERE
# D- M* X$ x: S7 {8 Z8 C. @      CAT_USER.id = friends.friend_id
6 L5 `, o/ n0 P4 CAND
0 _+ ~3 P9 t" l* ~1 c      friends.user_id = 1
7 v  _8 m5 M* N0 C& L0 ~# CUNION' |  k+ f: ^4 i
SELECT% }4 V' B4 D6 d5 k) q, Z0 z  P
        fof.user_id, fof.friend_id, username
- s1 _. X7 b$ xFROM
' P' O$ O0 ~; c& r5 ^% X# F. c        FRIEND_LIST friends, FRIEND_LIST fof, USER+ l& J1 z" o4 L4 G2 G5 H/ f
WHERE
* T6 Y8 A. s; E        USER.id = fof.friend_id. s' G) B$ z* ]% m3 i$ y2 w" L
AND! S2 m& R9 t; A7 C. f
        friends.friend_id = fof.user_id
( ]/ E: l3 ~8 Z! M AND
9 W, f* ]) B" J3 ]4 N9 k2 h        friends.user_id = 1;# J1 y* X+ D4 D# |  N; E5 F
               
* M% D" D2 t: ?) x( Q( B4 X2 O解决方案:
' A) c4 a* L5 t0 p% h$ L+ C, _5 p% Y                1 ~* w' T5 @* V6 Q; P4 j7 w5 Q* k5 y7 ?

/ W9 v' X0 s* [8 o4 {5 [7 X4 @, Z7 h/ U- d1 s
                这效率较低,但可读性强:
' ]; T. `( |+ M8 xSELECT friends.user_id, friends.friend_id, username
; K" C  G+ e" _: T$ e3 aFROM FRIEND_LIST friends, USER( f6 M7 w8 w, Q( ]2 O
WHERE USER.id           = friends.friend_id
" J3 N' i* y5 }' h3 Q% }! q) ^ AND  USER.id = 1# g2 B( Z5 ]4 ~- U/ h
UNION4 e# C3 ], U  r% i' i( @) z% [9 n* Q/ T# @
SELECT USER.user_id, fof.friend_id, username 5 x% m4 c+ \% ]
FROM FRIEND_LIST friends, FRIEND_LIST fof, USER3 z2 [, o: a1 T4 S( c  ]  z
WHERE USER.id           = fof.friend_id
6 e9 a; T9 c" ` AND  friends.friend_id = fof.user_id
% _7 T" R' o' L. R( w/ X AND  USER.id = 1
( F+ }( w6 G5 t( _$ I) K或者" W/ T2 {4 [! o$ \( D! G$ j9 c
SELECT user_id, f_fof.friend_id, username
9 @9 u9 \3 w* z  w( WFROM USER, (
+ |7 q; s0 y" Q& c    SELECT f.user_id, f.friend_id, I: u9 G7 S" e- }6 \0 K1 ?" J
    FROM   FRIEND_LIST f
1 J. ~6 m# Q9 e/ O' F' M    WHERE  user_id = 16 }3 N$ s- s; }( G
    UNION. S0 M5 L) V1 M8 _8 x
    SELECT f.user_id, fof.friend_id' s; t4 n- {3 @: V% n3 L, e
    FROM   FRIEND_LIST f, FRIEND_LIST fof$ v/ `9 Y) L* X8 C" k5 {
    WHERE  user_id = 1
7 m7 ~5 z7 m; G2 F2 _) V! @     AND   f.friend_id = fof.user_id3 {! O. q$ ]' E  n
) as f_fof
# N: {1 \  P9 y( C) w$ r5 i; tWHERE USER.id           = f_fof.friend_id
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则