1、什么是自查询
MySQL的自查询(Self Join)是指在一个表中通过自身的多次查询来处理数据。自查询通常使用别名(Alias)来给表区分不同的实例
2、自查询通常用来解决什么问题
自查询常常用于解决一些复杂的问题,比如在同一个表中查找有关联关系的数据。在进行自查询时,需要使用不同的表别名来对同一张表进行多次引用
3、使用策略和方法
我们知道mysql一旦涉及到子查询的时候都是从里面先开始写逻辑的,这样写出来的sql比较清晰,自查询也算是子查询的一个分支吧,只不过它是自己查自己
4、实际使用
例如我这边有一张表 table记录了当前工序编号和工序名称的一张表,当当前工序编号等于10时代表它是第一道工序,当20代表第二道以此类推
4.1 例子讲解
SELECT
d.orderno,
d.order_now,
d.job_name
FROM table d
where d.main_code = 'SCZL20230527006'
得出结果:
而我们此时想要知道当前工序的上一道工序是什么应该怎么办呢(第一道工序前面肯定没有工序)
4.2 思考
让我们思考一下:首先要获取上一道工序要先获取什么呢?
对了,那就是肯定要先获取上一道的工序编号,而一张表已经不够我们使用的了,就需要通过自查询来关联两张相同的表
SELECT
d.orderno,
d.order_now,
d.job_name,
#通过连接本表,而本表main_code相同,且临时表的工序编号 = 原表的工序编号-10
(select
job_name
from table d1
where d1.main_code = d.main_code and d1.order_now = d.order_now -10
limit 1
) last_job
FROM table d
where d.main_code = 'SCZL20230527006'
得出结果:
但是我们会发现如果只是-10的话它的上一道工序万一没有岂不是就空了,如何才能保证它上一道工序哪怕没有也能获取到上上道甚至上上上道工序呢
4.3 进阶
我们这一次转换思路,先去获取它的上一道工序
SELECT
d.orderno,
d.order_now,
d.job_name,
#通过小于号获取到这个工序下面最大的一条工序编号
(select
max(d1.order_now)
from table d1
where d1.main_code = d.main_code and cast(d1.order_now as signed) < cast(d.order_now as signed)
) last_job
FROM table d
where d.main_code = 'SCZL20230527006'
结果如下,可见这一次除了第一道工序没有上一道工序,剩下的都有了
4、最后一步
现在获取到了工序编号,接下来只要获取到工序名称就好了,通过再次查询本张表获取工序名称
SELECT
d.orderno,
d.order_now,
d.job_name,
(
# 通过二次自查询获取工序名
select
job_name
from table d2 where d2.main_code = d.main_code and d2.order_now =
(
SELECT
max( d1.order_now )
FROM table d1
WHERE d1.main_code = d.main_code AND cast( d1.order_now AS signed ) < cast( d.order_now AS signed )
)
limit 1
) last_job
FROM table d
where d.main_code = 'SCZL20230527006'
5、结论
上面写的例子也只是平时sql中的一个比较绕的一小块内容,结合其他字段或者说这一块sql只是其中一个子查询,需要多加练习才能掌握自查询这一块的内容