大概如此,a为表名,c就是你的conditionSELECT * , sum(if(c='c',1,0)) as v, sum(if(c='a',1,0)) as w
FROM `a`
group by id 
having v=0 and w>0if应该是3.23就有的,还可以用case代替if

解决方案 »

  1.   

    我尝试把它改成这样
    SELECT * , sum(if(c='c',1,0)) as v
    FROM `a` where c='a'
    group by id 
    having v=0
    好像能够使用索引了。但是还是有use temporary,using filesort
    不知这个语句在大表上工作起来效率如何?
      

  2.   

    那试试这样
    SELECT * , sum(if(c='c',1,0)) as v, sum(if(c='a',1,0)) as w
    FROM `a`
    where c in ('a','c')
    group by id 
    having v=0 and w>0这样在where语句部分是使用了c上的索引的,速度会快一些。只使用c='a' 不行,因为‘c’没有统计到。
      

  3.   

    谢谢“你好!”
    好像是可以了,有时间仔细研究一下。
    另外好像手册对having的用法介绍很简单,你这种用法我还是第一次看到,能否给推荐一个这种用法的详细介绍?
      

  4.   

    不客气。having就是配合group by使用,对统计结果进行选择的,
    一般的sql书都会介绍到。
    网上也能找到一些文章的。