背景:在一条子查询语句中使用limit 1之后,完整的SQL执行完毕之后出现了多条数据
完整SQL如下:
select c.id, h.coefficient as lambda2, d.x3, d.writetime
from coolingwall c, distance d, heatconductivity h
where
c.id = 1
and
h.coefficient = (select coefficient from heatconductivity where h.id = c.conductivityid)
and
d.x3 = (select x3 from distance where d.coolingwallid = c.id order by writetime desc limit 1)
order by writetime /*desc limit 1*/
-----------------------------------------------------------
id labmda2 x3 writetime
1 14 4.6 2020-08-24 10:18:08
1 14 4.6 2020-08-24 10:17:19
隐去了其他无用的的参数,从该SQL中可以看到:c.id h.coefficient d.x3都是唯一固定的值,(当然了,如果d.x3 h.coefficient不是查出来唯一值,那么语句实际上是无法执行成功的,会报一个“子查询结果不唯一”的错误警告)。
在这条语句执行完毕之后,查询结果中出现了两个值。这就纳闷了,明明上述的查询参数都是唯一的,为什么会出现多个查询结果。我对子查询语句进行了回溯,在执行下面的SQL时发现,可以得到两个结果
select x3, writetime from distance where coolingwallid=1 order by writetime desc
---------------------------------------------------------
x3 writetime
4.6 2020-08-24 10:18:08
4.6 2020-08-24 10:17:19
也就是说第一条SQL中的d.writetime在MySQL执行的过程中,是执行过一次类似select d.writetime from d where d.x3 = d.x3这样的操作的。虽然c.id h.coefficient d.x3都是被限制的唯一值,但是writetime并不是唯一值,并不会因为在子查询中利用了limit 1,就同时把writetime的值限定为"2020-08-24 10:18:08",而是会执行一条类似select d.writetime from d where d.x3 = 4.6的语句,同时得到"2020-08-24 10:17:19"和"2020-08-24 10:18:08"两个值。因此,最终的结果会出现多条数据
至于背后MySQL的语句具体是怎么执行的,水平有限,不清楚应当怎么去查询相关的资料。仅在此做以记录。