Mysql 在创建查询以汇总表中出现的次数时需要帮助

Mysql 在创建查询以汇总表中出现的次数时需要帮助,mysql,sql,Mysql,Sql,我有一个包含如下数据的表: event | session id | uid --------------------- foo | 1 | a bar | 1 | a foo | 2 | b cat | 2 | b cat | 3 | a cat | 4 | c foo | 5 | c cat | 5 | c foo

我有一个包含如下数据的表:

event | session id | uid 
---------------------
foo   | 1          | a
bar   | 1          | a
foo   | 2          | b
cat   | 2          | b
cat   | 3          | a
cat   | 4          | c
foo   | 5          | c
cat   | 5          | c
foo   | 6          | b
foo   | 7          | a
dog   | 8          | c
dog   | 9          | b
bat   | 10         | c
uid | foo | bar | cat | total_events
a     2     1     1       4
b     2     1     1       4
我想创建一个查询,以以下格式返回结果:

uid | event | # event used | # of sessions for uid
a   | foo   | 2            | 4 
a   | bar   | 1            | 4
a   | cat   | 1            | 4
b   | foo   | 2            | 4
b   | cat   | 1            | 4
b   | dog   | 1            | 4
c   | cat   | 2            | 5
c   | foo   | 1            | 5
c   | dog   | 1            | 5
c   | bat   | 1            | 5
我尝试使用:

select uid, event, count(*) from events where uid in (select uid from events group by uid) group by uid; 
但这并没有达到预期效果


任何帮助都将不胜感激

这可以通过CASE语句实现:

select uid,  count(case when event=`foo` then uid else 0 end)  as `foo`,   
count(case when    event=`bar` then uid else 0 end)  as `bar`,  
count(case when event=`cat` then uid else 0 end)  as `cat`, 
count((case when event=`foo` then uid else 0 end) +  count(case when    event=`bar` then uid else 0 end) + count(case when event=`cat` then uid else 0 end))  as totaL_events` 
from  events group by 1;
这将为您提供如下表格:

event | session id | uid 
---------------------
foo   | 1          | a
bar   | 1          | a
foo   | 2          | b
cat   | 2          | b
cat   | 3          | a
cat   | 4          | c
foo   | 5          | c
cat   | 5          | c
foo   | 6          | b
foo   | 7          | a
dog   | 8          | c
dog   | 9          | b
bat   | 10         | c
uid | foo | bar | cat | total_events
a     2     1     1       4
b     2     1     1       4
对于其他表格,请使用以下命令:

select uid, event, count(uid) as event_used  from events group by 1, 2
这里的桌子不那么花哨:

uid | event | total_events
a     foo     2     
a     bar     1   
b     foo     2   

请记住,按照您的要求,在每种不同的情况下,汇总每个用户的事件总数是不可能的,或者至少是没有效率的。只需通过uid和事件类型即可实现

嗨,这很有效。有一些小的打字错误,但在那之后就没问题了。非常感谢。
select t1.uid, t1.event, count(*) as `# event used`, t2.total_events as `# of sessions for uid`
form table t1
inner join (
   select uid, count(*) as total_events
   from table
   group by uid
) t2 on t2.uid = a.uid
group by t1.uid, t1.event, t2.total_events
order by t1.uid, `# event used` desc