MySQL请求在2个表中合并和搜索
我有两张桌子。我的一个用户表是: 我正在使用SQL检测附近的人:选择id,3959*acos-cos-radians37*cos-radians-lation*cos-radians-longitude-radians-122+sin-radians37*sinradianslatitude作为与用户的距离剃须距离<50按距离递减限制排序20 其他匹配项如下所示:MySQL请求在2个表中合并和搜索,mysql,sql,Mysql,Sql,我有两张桌子。我的一个用户表是: 我正在使用SQL检测附近的人:选择id,3959*acos-cos-radians37*cos-radians-lation*cos-radians-longitude-radians-122+sin-radians37*sinradianslatitude作为与用户的距离剃须距离
id sender receiver status
----- ----- ----------- -----------
其中发送者是发送邀请的人,接收者是接收邀请的人
SQL请求应该在用户中搜索附近的人,并在匹配项中检查他们的ID。如果作为发送方和接收方的ID不存在,则返回要建立新连接的人员的用户ID
例如,Paul正在搜索附近的人,我们从用户那里看到Dave就在他附近。所以,如果Dave ID不在matches表中,或者Paul==receiver,status==0,则应该只将Dave ID返回给Paul
如何编写此SQL查询以返回附近人员的20个ID?我将距离公式更改为自mysql 5.7以来可以使用的公式。 你没有指定你的数据库或者展示一个小提琴的例子来展示你的系统,所以我选择了5.7作为mini9mum,正如你在小提琴中看到的那样,它在8.0中也能工作 内部查询需要两件事:搜索的用户id和他的位置,因为他被排除在结果之外,当然还要计算距离 查询的结果在where子句中被检查——我希望我的想法是正确的,所以您应该检查一下
dbfiddle谢谢!我怎样才能联系到你?
id sender receiver status
----- ----- ----------- -----------
CREATE TABLE users
(`id` varchar(5), `name` varchar(5), `longitude` varchar(11), `latitude` varchar(11))
;
INSERT INTO users
(`id`, `name`, `longitude`, `latitude`)
VALUES
('1', 'Mark', '-76.316528', '40.036027'),
('2', 'John', '-95.995102', '41.25716'),
('3', 'Paul', '-82.337036', '29.645095'),
('4', 'Dave', '-82.337036', '29.645095'),
('5', 'Chris', '-76.316528', '40.036027'),
('6', 'Manny', '-82.338036', '29.645095'),
('7', 'Fred', '-82.338036', '29.646095')
;
✓
✓
CREATE TABLE matches
(`id` int, `sender` int, `receiver` int, `status` int)
;
INSERT INTO matches
(`id`, `sender`, `receiver`, `status`)
VALUES
(1, 3, 4, 0),
(2, 1, 5, 1),
(3, 6, 3, 1)
;
✓
✓
SELECT
id
, ( 3959 * acos( cos( radians(37) ) * cos( radians( latitude ) )
* cos( radians( longitude )
- radians(-122) ) + sin( radians(37) )
* sin(radians(latitude)) ) ) AS distance
FROM
users
HAVING distance < 50
ORDER BY distance
DESC LIMIT 20
id | distance
:- | -------:
SELECT
a.id
,a.distance
FROM
(Select
id,
st_distance_sphere(POINT(-82.337036, 29.645095 ), POINT(`longitude`, `latitude` ))/1000 as distance
FROM
users u
WHERE id <> 3
HAVING distance < 50
ORDER BY distance
DESC LIMIT 20) a
WHERE
a.id in (SELECT `sender` FROM matches WHERE status = 1)
OR a.id NOT IN ( SELECT `sender` FROM matches UNION ALL SELECT `receiver` FROM matches )
ORDEr BY a.distance ASC
id | distance
:- | ------------------:
6 | 0.09663995445895139
7 | 0.14732089261518266