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

2022-07-16 13:00:06 浏览数 (2)

题目的要求就是查询表中距离最近的两棵树之间的距离。并将结果进行重命名(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;

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

0 人点赞