2014-01-22 46 views
0

我有了這樣的數據表:創建查詢需要幫助,總結出現次數在表

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 | 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; 

,但如預期,沒有工作。

任何幫助將不勝感激。

回答

1
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 
+0

嗨,這工作像一個魅力。有一些小錯別字,但在那之後它很好。謝謝。 – okonomiyaki

0

這可以用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; 

這會給你這樣的一個表:

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和類型來實現事件。