2014-12-21 105 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你要記住。