回答

收藏

友谊系统的SQL结构与查询

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

我正在编写一个友谊系统,它有两个表。% w; q% U; x3 R/ S- i5 D
成员0 k( J! t( I4 q: g
ID
, \% ]4 ?/ z; r& l8 n- N* R8 @用户名. i7 e8 v, J1 V$ g. c
密码% [; j8 n$ M% R0 J% c
; o! O1 n( A' _2 e) p* m( g
朋友们
$ d2 _" u  I* V6 uID# e/ w. B6 j8 u& g% z1 x+ m
用户身份
; ~; ]3 F) W& U: Ufriend_id
) e0 k7 E9 l. S2 o& `状态* i  R2 _) @& j$ Q6 b# k5 Q& T

6 ?0 x; X: C( n假设我想要一个可以选择成员$ userId的朋友ID的查询,如何在一个查询中做到这一点?
- i, k9 w1 T0 y% d7 o+ b我找到了一个解决方案,可以进行2次查询。拳头选择朋友在哪里user_id = $userId,第二个选择朋友在哪里friend_id =
; q6 y6 F1 t0 W6 a1 c$userId,然后将它们混合成一个数组。如果没有其他解决方案,我将使用它。
1 |1 ~- R, z8 S9 w3 G3 E请对SQL结构和查询有任何想法吗?: f- r; M4 Q9 `/ x& g% t9 d
                1 b* W/ w! P6 r9 u# ]0 t
解决方案:
) `" ~% q# N+ z7 `  O               
$ `' O5 c/ `7 V  a7 a1 T! \
- @% C: ^- l+ f' m; e% l8 f, I+ `* u
                使用:
) Z+ x9 |+ E: S* Q. `SELECT f.friend_id2 s& v- E/ A- L
  FROM FRIENDS f
  f! t! t: E1 K4 m* `: v WHERE f.user_id = $user_id
) g. z! V. @9 Q1 e1 NUNION
7 }0 ?6 g9 W+ Q3 J, kSELECT t.user_id4 E; L( h" M5 }( ]7 x
  FROM FRIENDS t3 C4 }& {/ j: G+ m
WHERE t.friend_id = $user_id
. N! \6 v6 s4 P使用UNION将删除重复项。 UNION ALL会更快,但不会删除重复项。
7 e# X# N' ~5 m; R! ]; Z如果要从MEMBERS表中获取朋友的信息,请使用:4 C4 N: |+ a5 }9 L. N7 l+ Z
SELECT m.*
- ~# x3 m8 [0 e9 g, h" v# P+ j  FROM MEMBERS m
& P4 {% K6 V4 h5 R% w1 b* c6 W7 f  JOIN (SELECT f.friend_id 'user_id'
# e2 P8 C: u' }4 n4 q( Y5 m          FROM FRIENDS f
; e3 u9 E' D1 }" Q4 \! F9 u         WHERE f.user_id = $user_id
5 g' i/ p2 H  R( l        UNION. E6 P( `# e( G6 r2 p
        SELECT t.user_id
" @5 t' r2 j' Y" z  N; q( R% D          FROM FRIENDS t
6 _7 A( D! S0 ^0 u; P         WHERE t.friend_id = $user_id) x ON x.user_id = m.id, `5 M! G, W; R3 R
顺便说一句:我希望您在变量上使用mysql_escape_string,否则您将冒着SQL注入攻击的风险:6 ?9 K% J3 q4 v
9 U6 t6 G* l0 Z% i

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则