2014-12-21 114 views
-2

我的表是这样的:MySQL查询至少一次

名称:用户交易数据
日期格式DD/MM/YYYY的只有4个月(9月,十月,十一月,十二月 数据)

Id User Date 
25 127 23/10/2014 
26 128 25/11/2014 
25 127 22/11/2014 
47 17 22/1/2014 
25 127 12/9/2014 
25 127 22/12/2014 

如果我想查找在30天内至少存在一次其条目的用户。 答案应该是127用户127共4个月内至少存在一次
用户128在十一月做只有一个事务未完成交易至少每月一次,以便不选择

如何写查询这个?

+1

“Id”列是什么意思?显然,这不是主要关键。 –

+0

ID 25和user127的相应条目在每个月出现 –

+1

因此,您想要查询所有每月都有条目的用户ID,直到今天?但从哪一天算起? –

回答

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

SELECT * 
FROM TABLE_NAME 
WHERE Date_Column >= DATEADD(DAY, -30, GETDATE()) 

https://stackoverflow.com/a/21912827

0
SELECT User, COUNT(*) AS number_of_presence FROM (
    SELECT DATE_FORMAT(`Date`,'%Y-%m') AS date_month, User  
    FROM `table` 

    GROUP BY date_month, User 
) TMP 
GROUP BY User 
HAVING number_of_presence = 4 

group by用于避免同一用户多次。

SQL Fiddle

+0

不工作!你能解释一下日期需要做什么吗? –

+0

查看更新的答案.. – Riad

0

我认为你是之后的任何连续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; 

创建备案的结构:

CREATE TABLE appearances 
    (`Id` int, `User` int, `Date` date) 
; 

INSERT INTO appearances 
    (`Id`, `User`, `Date`) 
VALUES 
    (25, 127, '2014-10-23'), 
    (26, 128, '2014-11-25'), 
    (25, 127, '2014-11-22'), 
    (47, 17, '2014-01-22'), 
    (25, 127, '2014-09-12'), 
    (25, 127, '2014-12-22') 
; 

小提琴:http://sqlfiddle.com/#!2/1a3363/7/0

0

如果你知道你要检查用户存在的日期,您可以选择所有行WHERE日期在您的范围内。我会使用BETWEEN关键字。例如,如果你想谁在三月份的活跃用户,你可以做这样的事情:

SELECT * 
FROM myTable 
WHERE dateColumn BETWEEN '2014-03-01' AND '2014-03-31'; 

对于这个具体的例子,好像你希望谁在每个由至少一个购买的用户过去4个月。你可以做的是使用开始通过使用DATE_SUB()功能设置起始日期越来越每个的最后4个月行:

SELECT * 
FROM myTable 
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH); 

一旦你的,你可以通过添加一个GROUP BY语句组用户每月得到每用户每月一行:

SELECT * 
FROM myTable 
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH) 
GROUP BY user, MONTH(date); 

一旦你有,你可以从它拉出用户HAVING四排,因为这意味着他们已经进行了购买每个四个月:

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; 

这里是SQL Fiddle的例子。

此外,这里有一些很好的日期和时间functions你要记住。