MySQL多重计数基于两列,单个表中有多个GROUP BY

时间:2017-07-21 14:07:09

标签: mysql

我有一个如下所示的查询,它工作正常,但没有优化,因为运行需要1.5秒。如何使其达到优化结果?

select h.keyword_id,

    ( select count(DISTINCT(user_id)) from history where category_id = 6
      and h.keyword_id=keyword_id group by keyword_id ) as cat_6,

    ( select count(DISTINCT(user_id)) from history  where category_id = 7
      and h.keyword_id = keyword_id group by keyword_id ) as cat_7

    from 

    history h group by h.keyword_id

历史记录表

his_id  keyword_id category_id user_id

1       1           6           12
2       1           6           12
3       1           7           12
4       1           7           12
5       2           6           13
6       2           6           13
7       2           7           13
8       3           6           13

结果:

keyword_id  cat_6       cat_7

1           2            2 (unique users)
2           2            1
3           1            0  

1 个答案:

答案 0 :(得分:0)

您可以像这样重写您的查询:

select h.keyword_id,
count(distinct if(category_id = 6, user_id, null)) as cat_6,
count(distinct if(category_id = 7, user_id, null)) as cat_7
from 
history h 
group by h.keyword_id

基于样本数据的理想结果是错误的。在每个keyword_id中,始终只有一个不同的user_id。

  • 您可以在sqlfiddle here
  • 中查看操作中的查询

要进行更多优化,您必须发布show create table history的结果和explain <your_query>;的输出