当前位置: 首页 > 面试题库 >

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

袁桐
2023-03-14
问题内容

我有2张桌子。我的其中一张表users是:

id         name     longitude       latitutde  
-----      -----    -----------    -----------
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

我正在使用SQL检测附近的人:SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(latitude)) ) ) AS distance FROM用户HAVING distance < 50 ORDER BY distance DESC LIMIT 20

另一个matches是这样的:

id         sender    receiver        status  
-----      -----    -----------    -----------

发送者是发送邀请者的人,接收者是接收者的人。

SQL请求应在users人员附近搜索并检查matchesID。如果没有作为发送者和接收者的ID,则返回此人的用户ID以建立新的连接。

例如,保罗在寻找附近的人,而戴夫users则在他附近寻找。因此,仅当Dave ID不在matches表中或Paul == receiverAND
status == 0时,才应将Dave ID返回给Paul 。

如何编写此SQL查询以返回附近人员的20个ID?


问题答案:

我将距离公式更改为自mysql
5.7起可用的格式。您没有_指定您的数据库或提供了一个小提琴示例来展示您的系统,因此我选择5.7作为mini9mum,它也可以在8.0中使用,就像您在小提琴中看到的那样。

内部查询需要两件事:搜索的用户ID和他的位置,因为从结果中排除了他,并且当然要计算距离。

查询的结果在where子句中检查-我希望我有正确的主意,因此您应该检查一下

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


 类似资料:
  • 问题内容: 我有2个列表,每个列表大小相等,并且有兴趣将这两个列表合并并将其写入文件。 -结果列表应类似于[(1,2 ,,(2,3),(3,4),(5,5)] 之后,我希望将其写入文件。我怎样才能做到这一点? 问题答案: 文件中的结果输出为:

  • 问题内容: 我有2个数组 我是否可以将这些单独的数组合并为一个并将这些值相加,以便结果为: 这是我目前拥有的功能,但我似乎无法使其工作: 问题答案: 可以用两行代码完成此实际计算,而无需循环: http://codepad.viper-7.com/ieSkHQ 您只需要进行适当的调整即可解决您的嵌套结构。

  • 问题内容: 如何构造一个SQL语句以跨多个平面无关表运行,并显示结果以及选择结果和结果的表名。 这种情况是这样的,我有几个表,每个表具有相同的列名。这是我从外部各方收到的数据,它们原样存储在不同的表中。 相同的表如下所示: 我需要一个SQL语句,该语句可在所有表中使用伪代码进行搜索: 在以下演示文稿中给出结果: 更复杂的是,该列可能不在所有表中,因此,如果在该表中找不到该列,则需要仔细进行查询。

  • 我需要一些关于mysql查询的帮助。 我有两张桌子, 正确的排序必须是: 1)光-3(3票) 2)光-2(2票) 2)光-1(2票) 2)光-4(1票)

  • 问题内容: 如何合并结构相同的两个MySQL表? 这两个表的主键将发生冲突,因此我考虑了这一点。 问题答案: 您也可以尝试: 这允许table_1中的行取代table_2中具有匹配主键的行,同时仍插入具有新主键的行。 或者, 将使用来自表_2的相应行更新表_1中已经存在的行,同时插入具有新主键的行。

  • 问题内容: 我有以下SQL语句。 视图在哪里。 现在,我想添加一个或多个表作为联接,以便我可以在列上进行文本搜索,例如包含员工信息,并且可以与 我已经在表上为列创建了索引,但是由于我将sql语句修改为,因此无法与v_depts一起进行搜索 它给我错误 即使我已经为表中的emp_name列创建了索引。我怎么解决这个问题? emp_name的索引语句 问题答案: 我通常通过实例化它们的结构化XML视图