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