题目
动作表:Actions
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| user_id | int |
| post_id | int |
| action_date | date |
| action | enum |
| extra | varchar |
+---------------+---------+
此表没有主键,所以可能会有重复的行。
action 字段是 ENUM 类型的,包含:('view', 'like', 'reaction', 'comment', 'report', 'share')
extra 字段是可选的信息(可能为 null),其中的信息例如有:1.报告理由(a reason for report) 2.反应类型(a type of reaction)
编写一条SQL,查询每种 报告理由(report reason)在昨天的报告数量。假设今天是 2019-07-05。
查询及结果的格式示例:
Actions table:
+---------+---------+-------------+--------+--------+
| user_id | post_id | action_date | action | extra |
+---------+---------+-------------+--------+--------+
| 1 | 1 | 2019-07-01 | view | null |
| 1 | 1 | 2019-07-01 | like | null |
| 1 | 1 | 2019-07-01 | share | null |
| 2 | 4 | 2019-07-04 | view | null |
| 2 | 4 | 2019-07-04 | report | spam |
| 3 | 4 | 2019-07-04 | view | null |
| 3 | 4 | 2019-07-04 | report | spam |
| 4 | 3 | 2019-07-02 | view | null |
| 4 | 3 | 2019-07-02 | report | spam |
| 5 | 2 | 2019-07-04 | view | null |
| 5 | 2 | 2019-07-04 | report | racism |
| 5 | 5 | 2019-07-04 | view | null |
| 5 | 5 | 2019-07-04 | report | racism |
+---------+---------+-------------+--------+--------+
Result table:
+---------------+--------------+
| report_reason | report_count |
+---------------+--------------+
| spam | 1 |
| racism | 2 |
+---------------+--------------+
注意,我们只关心报告数量非零的结果。
产生数据
DROP TABLE Actions;
CREATE TABLE Actions (user_id INT, post_id INT, action_date DATE, ACTION VARCHAR(20), extra VARCHAR(20));
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('1', '1', '2019-07-01', 'view', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('1', '1', '2019-07-01', 'like', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('1', '1', '2019-07-01', 'share', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('2', '4', '2019-07-04', 'view', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('2', '4', '2019-07-04', 'report', 'spam');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('3', '4', '2019-07-04', 'view', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('3', '4', '2019-07-04', 'report', 'spam');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('4', '3', '2019-07-02', 'view', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('4', '3', '2019-07-02', 'report', 'spam');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('5', '2', '2019-07-04', 'view', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('5', '2', '2019-07-04', 'report', 'racism');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('5', '5', '2019-07-04', 'view', 'None');
INSERT INTO Actions (user_id, post_id, action_date, ACTION, extra) VALUES ('5', '5', '2019-07-04', 'report', 'racism');
解答
选出时间为前一天 且action为report 的记录
SELECT *
FROM Actions AS A
WHERE DATEDIFF('2019-07-05', A.`action_date`) = 1 AND A.`action` = 'report';
对extra分组统计post_id的数量
SELECT A.`extra` AS report_reason, COUNT(DISTINCT A.`post_id`) AS report_count
FROM Actions AS A
WHERE DATEDIFF('2019-07-05', A.`action_date`) = 1 AND A.`action` = 'report'
GROUP BY A.`extra`
ORDER BY A.`extra` DESC;