LintCode-Logo 查询相距最近的两棵树苗

举报
兰舟千帆 发表于 2022/07/15 00:01:15 2022/07/15
【摘要】 题目的要求就是查询表中距离最近的两棵树之间的距离。并将结果进行重命名(shortest_distance) 题解一:(采用聚合函数和自连接) SELECT MIN(ABS(a.distance...

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
题目的要求就是查询表中距离最近的两棵树之间的距离。并将结果进行重命名(shortest_distance)

题解一:(采用聚合函数和自连接)

SELECT MIN(ABS(a.distance - b.distance)) AS shortest_distance
FROM sapling_distances AS a
INNER JOIN sapling_distances b
ON a.id != b.id;

  
 
  • 1
  • 2
  • 3
  • 4

这是一段非常简单易懂的解法,字段并不复杂。
注意的也就是很小的细节。距离的话,采用了求绝对值和外加最小值前提的条件。然后就是自连接查询。自连接查询的条件就是两者的id不相同。如果相同的那么查询距离就没意义了。如果id相同就是比较的是自身。自身和自身有什么好比的呢?
!= 还可以用<>代替。意思一样

题解二:(采用嵌套查询思维)

SELECT MIN(distance_diff) AS shortest_distance FROM (
	   SELECT  abs(b.distance - a.distance) AS distance_diff FROM sapling_distances a, sapling_distances b
	   WHERE a.id <> b.id
) cc
HAVING shortest_distance is not null;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

采用的是嵌套查询的思维,也是非常好理解的。外层对要求结果求最小值,内层对查询距离求绝对值。内存对表的处理就是两次命名表,使之成为不同名表,然后进行附加条件。最后需要注意的就是cc这个作为子查询表的命名,如果没有的话,会报错,这是语法要求。

题解三:(另一种思维模式,其实没什么特别)

select min(a.distance - b.distance) shortest_distance
from sapling_distances a
    join sapling_distances b on a.distance > b.distance
having shortest_distance is not null;

  
 
  • 1
  • 2
  • 3
  • 4

一个限制条件a.distance>b.distance这样就代替了abs()聚合函数,这样也可以正常得到结果。

题解四:(多此一举的解法,简单问题复杂化)

select min(s2.distance-s1.distance) shortest_distance from
(select distance,@rownum1:=@rownum1+1 r1 
from sapling_distances,(select @rownum1:=0) ra
order by distance) s1,
(select distance,@rownum2:=@rownum2+1 r2 
from sapling_distances,(select @rownum2:=0) rb
order by distance) s2
where s1.r1 = s2.r2-1 having shortest_distance is not null;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

不做说明,因为我不会。解法摘自网友。对于这种解法真的感觉深恶痛绝。简单问题复杂化,不可为也。好吧!我还没用过这种方法,等学会了再来补充。

文章来源: daodaozi.blog.csdn.net,作者:兰舟千帆,版权归原作者所有,如需转载,请联系作者。

原文链接:daodaozi.blog.csdn.net/article/details/122878249

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。