mysql - 获取过去三年内发出请求的所有用户

标签 mysql sql postgresql group-by

我想获取过去三年中提出请求的所有用户列表。

请求(request_id、request_day、user_id、userprofile_id)

我做的对吗?

SELECT user_id
  FROM requests
WHERE EXTRACT(YEAR FROM request_day) IN ( 2014,2015,2016 )
GROUP BY user_id
HAVING COUNT(*) = 3;

最佳答案

您当前的方法几乎是正确的。您需要做的就是按不同年数计算:

SELECT user_id
FROM requests
WHERE YEAR(request_day) IN (2014, 2015, 2016)
GROUP BY user_id
HAVING COUNT(DISTINCT YEAR(request_day)) = 3;

如果 DISTINCT 年计数为 3,则意味着用户在 WHERE IN 子句中拥有所有三年。

请注意,另一种方法是条件聚合:

SELECT user_id
FROM requests
GROUP BY user_id
HAVING SUM(CASE WHEN YEAR(request_day) = 2014 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN YEAR(request_day) = 2015 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN YEAR(request_day) = 2016 THEN 1 ELSE 0 END) > 0

如果您的查询变得更复杂,这种方法会更好地扩展。

关于mysql - 获取过去三年内发出请求的所有用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297488/

相关文章:

php - 使用 php 从 sql 数据库下载后,我得到一个空的 excel 文件

postgresql - 如何通过一个单一的操作从生产数据库中克隆测试数据库?

mysql - 通过命令行将sql文件导入mysql

PHP PDO 获取所有行名称作为包含值的对象

mysql - 数据透视表错误

mysql - 恶意软件清除后数据库中的引号逃逸

postgresql - Postgres 使用字符串中的枚举更新列

java - 如何使用 UUID 作为 Hibernate 实体的主键?

python - 操作错误(2003、 "Can' t 连接到 '127.3.138.130' (111) 上的 MySQL 服务器")

php - PHP如何与同一台服务器上的MySQL通信