|
我的MySQL表结构是这样的。0 _* s# e2 J' M. q0 f+ I
USER
- B* |: j4 k6 J/ W3 K4 |int id- t+ H9 X" X% I0 q0 n
varchar username6 R h5 L6 ?- t0 k+ V/ U
FRIEND_LIST
: Z! w; s. q( m- M, }* s5 lint user_id' H# O$ _. c* z/ t
int friend_id4 ~! I; Q+ ]+ [" v' q
对于每个朋友关系,我在FRIEND_LIST中插入2条记录。如果用户1是用户2的朋友,则将下一行插入FRIEND_LIST6 i% h4 _1 g+ e: P5 L9 X
1,2# F6 x: _% O. X# Q
2,1 Q# S; o; { R" P. e* f' X7 W
我想结识特定用户的朋友和朋友的朋友。1 A$ J( j8 H, a2 H" G2 I
选择应返回列a,b,c。 Z( Y2 l# h) B+ Z( p- G5 X* O
a: user_id( E4 ]$ K# l. Q1 b+ x% M( e
b: friend_id
7 g3 y) _2 |5 _3 {5 E- F# h/ f% Kc: username (username of friend_id )8 ~3 v! `7 i& f. [+ ?1 G* n! n
If 1 is friend of 2 and 3.
& [) T2 b b$ [ v8 {/ v4 J7 {2 is friend of 3, 4 and 5
/ E2 d5 `% C3 x- _: n3 is friend of 5,6,7- I: g( |+ Q7 a! }
然后获取1的朋友和朋友的朋友的查询应返回:, q3 v( I- [. c
1 2 two
q8 t, M% a: Z$ B+ _0 W v* p1 3 three
4 ~) P. M4 O6 A6 w q. N2 1 one
) H; ^4 ~3 j) C) H) u6 \/ w" r4 D+ t2 3 three
- p8 ]/ B# E4 U9 q2 4 four- p+ t; D4 }; {
2 5 five6 l: U9 K) b7 y! }8 l' u
3 1 one, e8 ?& h Z, p: m f1 N" w
3 5 five
2 O( q7 p5 `& i$ D3 6 six
3 C( [7 I2 [/ p8 y0 i K3 7 seven5 H- t7 s% h% b& l: U
我可以通过一个查询获得这些行吗?# E" O7 S. K3 V) f
更新答案: 我对DVK的答案做了一些修改,这是返回我所要查找内容的查询。
% c1 V: n8 Y; ]SELECT friends.user_id, friends.friend_id, username+ o+ l3 A/ @' g+ _
FROM& ~3 e5 r) o, }2 d2 c
FRIEND_LIST friends, USER
% S1 t3 j! T0 o# g5 z% a& E# x6 m0 {WHERE
9 A1 ~: ?8 p- E! I) Y CAT_USER.id = friends.friend_id
0 j. ]5 s0 V8 B4 X) z0 P: [AND
* Q3 j; k3 B' W) x p& Z, ] friends.user_id = 1! L" t1 {6 {1 i5 H4 a3 ~( o& l
UNION
8 ]( P' V: X( d2 e* {* Y8 ^- b7 qSELECT
& \' t6 X/ y7 X' A. ? fof.user_id, fof.friend_id, username
7 {! f# o6 p* P$ o# f" ^! vFROM9 p7 e p6 M- n5 _) A, B
FRIEND_LIST friends, FRIEND_LIST fof, USER
r# n9 ?* E9 F( t0 o% F0 cWHERE/ L# n- v; d6 I2 |9 w; p
USER.id = fof.friend_id9 }& ^ I' z1 P4 `! g- l7 F& c! ?
AND$ Z) D, u: K2 {6 g7 |
friends.friend_id = fof.user_id$ k* K- v. s7 N2 Y
AND
/ |6 Z' w% l: s9 m friends.user_id = 1;
% {3 m1 B2 m e) |$ r _
c4 f* K% }5 R" }( Z解决方案:8 X3 r' Z6 S9 s f6 L6 j7 v
% f$ w& f. `: M! O4 t
1 N& {" ]) U f
3 v+ Z/ E3 c9 m0 Y% J
这效率较低,但可读性强:
2 a- Z2 [) Y# dSELECT friends.user_id, friends.friend_id, username
" n* ]5 u! b# n! } k" o$ [FROM FRIEND_LIST friends, USER' u! Q1 o6 H% \. ?4 a
WHERE USER.id = friends.friend_id6 j2 o" J# O( U' e& O& ~$ A/ i
AND USER.id = 1
" f( O5 p' L1 B; }# I7 P5 lUNION# `( j1 |# k2 W
SELECT USER.user_id, fof.friend_id, username 0 c( l0 R& V& h" Y# v; Q% E
FROM FRIEND_LIST friends, FRIEND_LIST fof, USER
) s: G/ \% \' k4 D" }WHERE USER.id = fof.friend_id
5 N5 L5 u: T/ @1 z- z) ^ ^ AND friends.friend_id = fof.user_id
8 K! C4 R! M$ u, W. T AND USER.id = 10 b- `3 b% Z/ s( w/ T0 R
或者
# c7 ^4 J0 E1 K! K- uSELECT user_id, f_fof.friend_id, username
* N, ?3 F6 e2 R) R: J H% HFROM USER, (: `, q% W3 ~/ z7 l
SELECT f.user_id, f.friend_id6 d+ |$ _8 u# Q4 p7 A" t5 j
FROM FRIEND_LIST f2 B9 Q5 d4 g) n( U; N7 [
WHERE user_id = 1
! k7 L- e/ @3 G- j+ \9 D/ e UNION+ D# l# {( j/ [
SELECT f.user_id, fof.friend_id
+ e3 T. ]/ z& W8 l$ U+ C- t" I FROM FRIEND_LIST f, FRIEND_LIST fof+ ? [$ ?5 {: G7 e
WHERE user_id = 12 @5 ~% e3 z: @0 g! ]" A* [3 [, h
AND f.friend_id = fof.user_id6 h2 v4 p. n: `) p0 Q5 x
) as f_fof+ |* \, M( g5 y/ @0 X
WHERE USER.id = f_fof.friend_id |
|