在x天内至少查询一次MySQL

在x天内至少查询一次MySQL,mysql,sql,Mysql,Sql,我的桌子是这样的: 名称:用户交易数据 日期格式DD/MM/YYYY 仅4个月的数据(9月、10月、11月、12月) 如果我想找到其条目在30天内至少出现一次的用户。 答案应该是127。由于用户127在所有4个月内至少出现一次 用户128在11月仅完成一笔交易。未完成交易每月至少一次,因此未选中 如何为此编写查询 SELECT * FROM TABLE_NAME WHERE Date_Column >= DATEADD(MONTH, -1, GETDATE()) 或 分组依据用于避

我的桌子是这样的:

名称:用户交易数据
日期格式DD/MM/YYYY 仅4个月的数据(9月、10月、11月、12月)

如果我想找到其条目在30天内至少出现一次的用户。 答案应该是127。由于用户127在所有4个月内至少出现一次
用户128在11月仅完成一笔交易。未完成交易每月至少一次,因此未选中

如何为此编写查询

SELECT * 
FROM TABLE_NAME
WHERE Date_Column >= DATEADD(MONTH, -1, GETDATE()) 

分组依据
用于避免多次使用同一用户

我想你已经连续30天了,对吧? 不幸的是,您可能必须将表本身连接起来,因为它会查找成对的行。那么查询将是:

select
  a1.User,
  a1.Date as fromDate,
  a2.Date as toDate,
  datediff(a1.Date, a2.Date) as span
from appearances a1, appearances a2
where
  a1.User=a2.User and
  a2.Date>a1.Date and
  datediff(a2.Date, a1.Date) <= 30;

fiddle:

如果您知道要检查用户是否在场的日期,可以选择日期在您范围内的所有行
。我会使用
BETWEEN
关键字。例如,如果希望用户在3月份处于活动状态,可以执行以下操作:

SELECT *
FROM myTable
WHERE dateColumn BETWEEN '2014-03-01' AND '2014-03-31';
对于这个特定的示例,您似乎希望用户在过去4个月内每年至少购买一次。您可以使用start,通过使用
DATE\u SUB()
函数设置开始日期来获取过去4个月中每个月的行:

SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH);
一旦您有了这些,您就可以将
GROUP BY
语句添加到GROUP BY user and MOUNT中,以获得每个user and MOUNT的一行:

SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
GROUP BY user, MONTH(date);
一旦你有了它,你就可以从中提取用户
的四行,因为这意味着他们在这四个月中的每一个月都进行了购买:

SELECT user
FROM(
  SELECT *
  FROM myTable
  WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
  GROUP BY user, MONTH(date)) t
GROUP BY user
HAVING COUNT(*) = 4;
这是一个例子


此外,这里还有一些好的日期和时间供您记住。

Id
列是什么意思?显然,它不是一个主键。ID 25,每个月都有相应的user127条目。您想查询到目前为止每个月都有条目的所有用户ID吗?但是从哪一天算起呢?请为你的桌子提供一个名字(这是人们在这里经常犯的一个错误,尽管它仍然让我感到惊讶)。你还需要更清楚地解释你在追求什么。例如,如果有一个条目(35、27、22/10/2014),该条目有资格被选中吗?那么(35、27、21/10/2014)呢?需要哪些条目才能选择用户27?Mahesh,我认为你真的需要更仔细地思考一下你真正想做的事情。不起作用!你能解释一下约会需要做什么吗?
SELECT *
FROM myTable
WHERE dateColumn BETWEEN '2014-03-01' AND '2014-03-31';
SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH);
SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
GROUP BY user, MONTH(date);
SELECT user
FROM(
  SELECT *
  FROM myTable
  WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
  GROUP BY user, MONTH(date)) t
GROUP BY user
HAVING COUNT(*) = 4;