这种语句,in后的子查询与子查询外部语句有关连,效率相当低. 以前我讲过. tb id classid 1 1 2 1 3 2 4 2 5 2 主查询对第一行处理时,子查询中得到结果集 1,2 主查询处理第二行时,子查询重新得到结果集 1,2 主查询处理第三行时,子查询重新得到结果集 3,4,5 .. 主查询中每处理一次行,子查询都要重新执行.如果in后的子查询与外部语句无关连,效率还是可以的. 比如 select * from tb where id in(select id from ta) 对于这种,查询优化时,会先执行子查询,并将结果缓存,主查询每处理一行时,条件只在缓存结果中匹配,而子查询不再重新执行. 相对于 select * from tb b where exists(select 1 from ta where id=b.id) 这种大多数人认为效率很高的语句来说, 这种情况下,in的效率更高.
没错是这样【不是循环,是分别按categoryid取两个ID.不过你应该按ID排个序.】
能不能说得再清楚些呢?的确改按这个id排序的,只不过再加一句"order by id"
但这个in的原理我实在是想不清楚,我想知道里面的执行过程!然后再看一下它的效率。书本上看了一些,都是类似or的用法,但解释不了这个,继续讨论。。
2,然后排序后取前两个.这个IN实际是ID = 每个categryid的最大的(最小的)的两个ID.
以前我讲过.
tb
id classid
1 1
2 1
3 2
4 2
5 2
主查询对第一行处理时,子查询中得到结果集 1,2
主查询处理第二行时,子查询重新得到结果集 1,2
主查询处理第三行时,子查询重新得到结果集 3,4,5
..
主查询中每处理一次行,子查询都要重新执行.如果in后的子查询与外部语句无关连,效率还是可以的.
比如
select * from tb where id in(select id from ta)
对于这种,查询优化时,会先执行子查询,并将结果缓存,主查询每处理一行时,条件只在缓存结果中匹配,而子查询不再重新执行.
相对于
select * from tb b where exists(select 1 from ta where id=b.id)
这种大多数人认为效率很高的语句来说,
这种情况下,in的效率更高.