查找旅行距离最长的前 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.name
和RIDES.id
(分别为USERS.name
)的附加排序来选择应该显示哪些记录。
【讨论】:
谢谢,什么条件只输出前 100 个用户,忽略最后一个位置的关系。我没有正确理解这部分,我应该只忽略最后一个位置的关系吗? @VIBHUBAROT:我更新了我的答案,提供了有关查询行为的更多信息。以上是关于查找旅行距离最长的前 100 名用户及其姓名的主要内容,如果未能解决你的问题,请参考以下文章