不是循环,是分别按categoryid取两个ID.不过你应该按ID排个序.

解决方案 »

  1.   

    你的意思是想每个categoryId相同的取两个吗
      

  2.   

    【 你的意思是想每个categoryId相同的取两个吗】
       没错是这样【不是循环,是分别按categoryid取两个ID.不过你应该按ID排个序.】
    能不能说得再清楚些呢?的确改按这个id排序的,只不过再加一句"order by id"
    但这个in的原理我实在是想不清楚,我想知道里面的执行过程!然后再看一下它的效率。书本上看了一些,都是类似or的用法,但解释不了这个,继续讨论。。
      

  3.   

    1,按每个categoryId把所有的ID取出来,
    2,然后排序后取前两个.这个IN实际是ID = 每个categryid的最大的(最小的)的两个ID.
      

  4.   

    这种语句,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的效率更高.