前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LintCode-Logo 查询相距最近的两棵树苗

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

作者头像
兰舟千帆
发布2022-07-16 13:00:06
2360
发布2022-07-16 13:00:06
举报
文章被收录于专栏:兰舟千帆的java学习笔记
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目的要求就是查询表中距离最近的两棵树之间的距离。并将结果进行重命名(shortest_distance)

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

代码语言:javascript
复制
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;

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

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

代码语言:javascript
复制
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;

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

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

代码语言:javascript
复制
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;

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

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

代码语言:javascript
复制
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;

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档