我有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
人员附近搜索并检查matches
ID。如果没有作为发送者和接收者的ID,则返回此人的用户ID以建立新的连接。
例如,保罗在寻找附近的人,而戴夫users
则在他附近寻找。因此,仅当Dave ID不在matches
表中或Paul == receiver
AND
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 (SELECTsender
FROM matches WHERE status = 1)
OR a.id NOT IN ( SELECTsender
FROM matches UNION ALL SELECT
receiver
FROM matches )
ORDEr BY a.distance ASCid | 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视图