查找旅行距离最长的前 100 名用户及其姓名

Posted

技术标签:

【中文标题】查找旅行距离最长的前 100 名用户及其姓名【英文标题】:Find top 100 users who traveled most distance and their name 【发布时间】:2020-01-29 04:27:03 【问题描述】:

我有两个具有给定架构的表

1) USERS


Name   Type    Description
id    string   Assigned id
name  string   name of user
email string   email of user

2) RIDES

Name      Type     Description
id        string   Assigned id
user_id   string   id of user
distance  integer  distance traveled

我必须编写查询来查找 TOP 100 移动距离最远的用户,并且他们的名字忽略了最后一个位置的关系。

这是我的答案,可能不正确。有人可以帮我解决这个问题吗?

SELECT TOP 100 USERS.name, RIDES.distance
FROM RIDES
ORDER BY RIDES.distance DESC
INNER JOIN RIDES ON USERS.id = RIDES.user_id

【问题讨论】:

SELECT ... FROM ... [JOIN] ... [WHERE] [GROUP BY] [HAVING] [ORDER BY] [LIMIT] 假设它是前 3 名。见meta.***.com/questions/333952/… 【参考方案1】:

select c.name, SUM(r.fare) from CITIES c left join USERS u on c.id=u.city_id left join RIDES r on u.id=r.user_id group by c.name Order by sum( r.fare) asc , c.name asc

【讨论】:

代码块请使用markdown【参考方案2】:
Select top 100 distinct u.name, 
(Select sum(distance) from rides where rides.user_id=u.id) 
as distance_travelled 
from users u inner join rides on u.id=rides.user_id 
order by distance_travelled desc, u.name 
Go

【讨论】:

只包含代码的答案被认为不是很有用。您应该解释原始代码有什么问题,并解释您为代码工作所做的更改。另外,正如您在接受的答案中看到的那样,TOP 关键字在 mysql 中不存在,所以您的答案是错误的【参考方案3】:

更新:我附上了一些数字以获取更多信息。 我在一次采访中得到了这个问题,问题应该理解为: 前 100 名用户的旅行次数最多 in total,因此 @GMB 的答案应该使用一些聚合函数来更新,例如

select distinct *, sum(distance) over(partition by user_id) from ...

我不记得表格、方案的所有细节(我猜问题描述还缺少另一个名为 CITIES 的方案?)等,但您应该能够按照这个提示轻松解决它。

【讨论】:

【参考方案4】:

你快到了。 TOP 在 MySQL 中不存在(你需要一个 LIMIT 子句代替)。此外,ORDER BY 子句位于JOIN 之后。

SELECT USERS.name, RIDES.distance
FROM USERS
INNER JOIN RIDES ON USERS.id = RIDES.user_id
ORDER BY RIDES.distance DESC, USERS.name, RIDES.id
LIMIT 100

这将为您提供前 100 个最长的游乐设施,以及相关的用户名。

如果您想要旅行最远距离的用户列表(他们的所有游乐设施加起来),那么您可以打开聚合:

SELECT USERS.name, SUM(RIDES.distance) total_distance
FROM USERS
INNER JOIN RIDES ON USERS.id = RIDES.user_id
GROUP BY USERS.id, USERS.name
ORDER BY total_distance DESC, USERS.name
LIMIT 100

如果至少有 100 个游乐设施(或分别为 100 个用户),上述每个查询都会为您提供正好 100 个结果。如果最后一个位置有平局,将使用USERS.nameRIDES.id(分别为USERS.name)的附加排序来选择应该显示哪些记录。

【讨论】:

谢谢,什么条件只输出前 100 个用户,忽略最后一个位置的关系。我没有正确理解这部分,我应该只忽略最后一个位置的关系吗? @VIBHUBAROT:我更新了我的答案,提供了有关查询行为的更多信息。

以上是关于查找旅行距离最长的前 100 名用户及其姓名的主要内容,如果未能解决你的问题,请参考以下文章

确定行进路径 mkmapview swift 上的距离

两个地点之间的行驶距离和旅行时间

使用 Google Maps API 查找两个位置之间的路线和距离并将其呈现在表格中

如何获取附近的用户和距离?

如何在颤动中获得估计的旅行时间和距离

查找超过 100K 个位置之间的距离