直线上的最近距离
这里学习的知识点就是连接的具体使用。
连接的分类:
- 内连接
- 外连接
- 自连接
这里问题使用的是自连接的使用,看完问题描述之后再仔细的分析问题;
1、问题描述:
表: Point
:
+-------------+------+
| Column Name | Type |
+-------------+------+
| x | int |
+-------------+------+
在SQL
中,x是该表的主键列。
该表的每一行表示X轴上一个点的位置。
找到 Point 表中任意两点之间的最短距离。
实际案例:
输入:
Point 表:
+----+
| x |
+----+
| -1 |
| 0 |
| 2 |
+----+
输出:
+----------+
| shortest |
+----------+
| 1 |
+----------+
解释:点 -1 和 0 之间的最短距离为 |(-1) - 0| = 1。
2、问题解析:
我们需要计算任意两点之间的距离。所以,需要进行一个分步的操作,所有的情况有n(n-1)
个情况。
我们使用的自连接操作:
我们可以将表与其自身,也就是和同名的表进行连接。这种连接方式称为自连接。因为是两个同名的表进行连接,所以如果直接执行连接,就会显示出两个同名的列。这样就无法对列进行识别了(发生错误),因此连接时必须定义别名。
创建一个表,来进行尝试分析:
MySQL [point]> select * from x;
+------+
| x |
+------+
| 1 |
| -1 |
| 0 |
| 2 |
| -3 |
+------+
5 rows in set (0.000 sec)
MySQL [point]> select * from x a join x b on a.x != b.x;
+------+------+
| x | x |
+------+------+
| -3 | 1 |
| 2 | 1 |
| 0 | 1 |
| -1 | 1 |
| -3 | -1 |
| 2 | -1 |
| 0 | -1 |
| 1 | -1 |
| -3 | 0 |
| 2 | 0 |
| -1 | 0 |
| 1 | 0 |
| -3 | 2 |
| 0 | 2 |
| -1 | 2 |
| 1 | 2 |
| 2 | -3 |
| 0 | -3 |
| -1 | -3 |
| 1 | -3 |
+------+------+
20 rows in set (0.001 sec)
MySQL [point]> select
-> *
-> from
-> x a
-> join x b ;
+------+------+
| x | x |
+------+------+
| -3 | 1 |
| 2 | 1 |
| 0 | 1 |
| -1 | 1 |
| 1 | 1 |
| -3 | -1 |
| 2 | -1 |
| 0 | -1 |
| -1 | -1 |
| 1 | -1 |
| -3 | 0 |
| 2 | 0 |
| 0 | 0 |
| -1 | 0 |
| 1 | 0 |
| -3 | 2 |
| 2 | 2 |
| 0 | 2 |
| -1 | 2 |
| 1 | 2 |
| -3 | -3 |
| 2 | -3 |
| 0 | -3 |
| -1 | -3 |
| 1 | -3 |
+------+------+
25 rows in set (0.000 sec)
MySQL [point]>
最后一个是没有进行键连接操作的使用方法。可以看见是按照n*n
的规则来进行分布的。
这个自连接的过程明白了之后,便开始这道题的解析:
select
min(abs(a.x - b.x)) as shortest
from
(
x a
join
x b
on a.x != b.x
)
最后的结果是正确的。