我有一个具有以下结构的mysql表:
|user_id|action_type|action_value|timestamp |
|-------|-----------|------------|----------|
|123 |click |search |20-07-2016|
|231 |click |search |20-07-2016|
|123 |click |delete |20-07-2016|
问题是,action_type可以采用多个值。它们可以是表格列但是是动态的,所以我决定将它们作为值放在列中。 Action_value是可以采取action_type的值。这是每个用户/每个日期的操作,我想知道是否可以进行返回以下内容的查询:
|action_type|timestamp |search|delete|
|-----------|----------|------|------|
|click |20-07-2016|2 |1 |
|-----------|----------|------|------|
对于给定的action_type,返回执行该操作的所有用户并按时间戳对其进行分组。
我尝试了以下查询,但我只是在两列中得到相同的数字:
SELECT T1.action_type, DATE(T1.timestamp), count(T1.action_value) 'search', count(T2.action_value) 'delete' FROM cohort_actions T1 INNER JOIN ( SELECT timestamp, action_value FROM cohort_actions WHERE action_value = 'delete' ) T2 ON DATE(T1.timestamp) = DATE(T2.timestamp) WHERE T1.action_type = 'click' AND T1.action_value = 'search' GROUP BY DATE(T1.timestamp);
答案 0 :(得分:2)
如果只需要计算行的子集,请在不想计数时使用NULL表达式。 COUNT()忽略NULL。
SELECT action_type, DATE(timestamp) AS `timestamp`,
COUNT(CASE action_type WHEN 'click' THEN action_value END) AS `search`,
COUNT(CASE action_type WHEN 'delete' THEN action_value END) AS `delete`,
FROM cohort_actions
GROUP BY action_type, DATE(timestamp);
由于我没有这些CASE表达式的ELSE子句,因此除非action_type是所需的值,否则表达式的结果为NULL。