题目的要求就是查询表中距离最近的两棵树之间的距离。并将结果进行重命名(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;
不做说明,因为我不会。解法摘自网友。对于这种解法真的感觉深恶痛绝。简单问题复杂化,不可为也。好吧!我还没用过这种方法,等学会了再来补充。