回答

收藏

MySQL要求在2个表格中进行合并和搜索

技术问答 技术问答 63 人阅读 | 0 人回复 | 2023-09-13

我有2张桌子。我的其中一张表users是:  a; `3 y; Z0 ~! ?
id         name     longitude       latitutde  ) S7 `: A0 p$ r' s
-----      -----    -----------    -----------. T+ h6 L" Y! w; G5 ?
1          Mark     -76.316528     40.0360272 o& h; Z, x6 O' k7 i9 g2 q
2          John     -95.995102     41.257161 n9 @9 [" b" K. V- @" T- y
3          Paul     -82.337036     29.6450954 c1 d6 \- z$ x6 a! G3 S
4          Dave     -82.337036     29.645095! P" i* M( E( x  m8 x# F' N! t% \$ X
5          Chris    -76.316528     40.036027
7 ~: o. a% C7 d2 ~我正在使用SQL检测附近的人:SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians(
2 [9 X# C8 s: N% _% a" W8 x& @latitude ) ) * cos( radians( longitude ) - radians(-122) ) + sin( radians(37)7 o. l, p3 L& ]1 P5 m
) * sin(radians(latitude)) ) ) AS distance FROM用户HAVING distance * Y) ?3 Q& \* R$ U4 Z
另一个matches是这样的:# t9 j, T& k- Y  ]
id         sender    receiver        status  - V- R7 X! m! f) z
-----      -----    -----------    -----------
- p+ `$ l) I! A0 `/ p  v& k发送者是发送邀请者的人,接收者是接收者的人。1 z% e1 d$ c; E5 o& k4 |
SQL请求应在users人员附近搜索并检查matchesID。如果没有作为发送者和接收者的ID,则返回此人的用户ID以建立新的连接。0 `/ I; x; X% p; S) V4 y* `. Y
例如,保罗在寻找附近的人,而戴夫users则在他附近寻找。因此,仅当Dave ID不在matches表中或Paul == receiverAND, {8 p: X+ a, n9 m6 ^2 ]( S
status == 0时,才应将Dave ID返回给Paul 。
8 u) ^# z* {3 x2 H! Y如何编写此SQL查询以返回附近人员的20个ID?: [% \, U. B% d  ]* f8 P
                9 @: [0 B" Y3 ~% M! N& B! ~
解决方案:
& a% Z$ V; y! t4 f  `: a                  m5 @1 ^% y! I+ W4 K% \3 m7 j
0 E/ d1 I7 @6 X) @" b" d7 n
" c( A. U0 x" Q# a; t7 t
                我将距离公式更改为自mysql
% X1 \7 t6 J  v- D5.7起可用的格式。您没有_指定您的数据库或提供了一个小提琴示例来展示您的系统,因此我选择5.7作为mini9mum,它也可以在8.0中使用,就像您在小提琴中看到的那样。
. H( A; W6 L( F内部查询需要两件事:搜索的用户ID和他的位置,因为从结果中排除了他,并且当然要计算距离。$ _( f& B( Y3 @( {9 S8 F1 M6 T+ \3 m
查询的结果在where子句中检查-我希望我有正确的主意,因此您应该检查一下
* n7 N( h4 C" E+ U2 p' k0 Z; o7 O4 |  m
CREATE TABLE users- T5 m' \* p6 ~6 T1 J0 ]* U2 X
    (`id` varchar(5), `name` varchar(5), `longitude` varchar(11),
) B- G$ t. d7 q4 platitude varchar(11))1 w8 t; Z0 f, z9 N+ x! f
    ;
% ~2 O3 t5 Z) y/ _0 ?5 p) uINSERT INTO users+ x# H$ y( h% t' z
    (`id`, `name`, `longitude`, `latitude`)
/ J* r& ~% [! i+ p7 FVALUES: s' D9 o( L0 \. ~% m8 \
    ('1', 'Mark', '-76.316528', '40.036027'),
# C; i. h& i( x    ('2', 'John', '-95.995102', '41.25716'),0 U0 \6 k2 G4 ?! l/ v
    ('3', 'Paul', '-82.337036', '29.645095'),' y* d, z/ k6 n
    ('4', 'Dave', '-82.337036', '29.645095'),
- _/ h" h! W/ U+ N5 k: Y# f    ('5', 'Chris', '-76.316528', '40.036027'),
! N1 I* @7 T8 M6 W    ('6', 'Manny', '-82.338036', '29.645095'),. o9 Q3 E6 R# z2 p' p* V0 l6 L' j
    ('7', 'Fred', '-82.338036', '29.646095')& t7 j. b2 L3 c
;
+ d% |; L9 I& {! x# C! ]  k; d0 ~  A3 P$ O$ z
?
' B' r1 }  G! `7 Z6 w?
) v7 Z4 M! F8 S" ^" l# }
7 i# a" [: s1 |. P2 _  p+ FCREATE TABLE matches
6 o" B) I6 {  l+ X3 j    (`id` int, `sender` int, `receiver` int, `status` int)
* c. f' a5 Z8 b;( a8 d. U8 `0 h! Z" l/ d
INSERT INTO matches0 v2 u0 y/ Q7 P  E5 }
    (`id`, `sender`, `receiver`, `status`)
4 d1 _2 J/ L6 E$ [- c$ B! n% H" @VALUES
( |0 X" F( v% F- \, d" W    (1, 3, 4, 0),9 L4 A: `. o) X1 r/ Y
    (2, 1, 5, 1),
' \: m3 ^" B( T    (3, 6, 3, 1)
, U# L' }. I  ?; {- G% N;" s. x2 |3 F" \% p  w+ K6 ^

1 {1 Y- i4 D) t% K& a?$ D. s9 G, F1 l" W. u) Z1 W5 |
?
5 W4 v1 [2 f; a! c3 hSELECT/ Z" c' n8 `5 D- a$ Z
  id2 V# g8 H$ e3 s7 w
  , ( 3959 * acos( cos( radians(37) ) * cos( radians( latitude ) )
  I8 Z" H6 U2 }( M9 A     * cos( radians( longitude )& O; _2 x; S3 o$ e
     - radians(-122) ) + sin( radians(37) )& }8 i+ ~$ k% g3 s* ^6 ^
     * sin(radians(latitude)) ) ) AS distance
. M8 g0 K; j1 T' E4 i! Y; J. _FROM( G  x% X% g2 c" O# P
    users
9 B: O- y& Q% u! K4 l5 GHAVING distance POINT(longitude, latitude ))/1000  as distance
! K3 x: ?0 X0 f- {% s( D        FROM
/ C( r8 D* O8 \2 {- I" V            users u" M$ x' j7 ?9 ?4 J
        WHERE id  3
( B% b" u+ h' }; F6 D        HAVING distance
8 i: D7 @" T. _( k9 J+ s0 vid | distance) C7 Q$ a# i' A: F; {- o. i9 q
:-| ------------------:
4 `( g& n/ V+ O+ H" `7 r8 D* ]9 _6 | 0.09663995445895139
, w* k' w' u& T4 z7 | 0.14732089261518266
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则