MySQL请求在2个表中合并和搜索

MySQL请求在2个表中合并和搜索,mysql,sql,Mysql,Sql,我有两张桌子。我的一个用户表是: 我正在使用SQL检测附近的人:选择id,3959*acos-cos-radians37*cos-radians-lation*cos-radians-longitude-radians-122+sin-radians37*sinradianslatitude作为与用户的距离剃须距离

我有两张桌子。我的一个用户表是:

我正在使用SQL检测附近的人:选择id,3959*acos-cos-radians37*cos-radians-lation*cos-radians-longitude-radians-122+sin-radians37*sinradianslatitude作为与用户的距离剃须距离<50按距离递减限制排序20

其他匹配项如下所示:

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