leetcode上的mysql解题--题一:自连接的使用

直线上的最近距离

这里学习的知识点就是连接的具体使用。
连接的分类:

  1. 内连接
  2. 外连接
  3. 自连接

这里问题使用的是自连接的使用,看完问题描述之后再仔细的分析问题;

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
	)

最后的结果是正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值