2015-12-02 60 views
0

我有一個數據庫查詢問題。MYSQL獲取最新購買用戶

建立我的用戶表是這樣的..

Id | PIN | biz_id | active_ind 
--- | --------------------------- 
1 | 123 | NULL |  Y 
2 | 456 | 1 |  Y 
3 | 789 | NULL |  N 
4 | 012 | 2 |  Y 

和我USER_PURCHASE表是這樣的

id user_id  date  amount 
---|----------|------------|--------| 
1 |  1 | 2014-04-03 | 5 | 
2 |  2 | 2015-03-04 | 5 | 
5 |  3 | 2014-04-03 | 6 | 
3 |  4 | 2015-03-03 | 6 | 
4 |  2 | 2015-03-04 | 7 | 
6 |  3 | 2013-03-03 | 7 | 
7 |  4 | 2013-12-24 | 8 | 
8 |  4 | 2013-01-01 | 8 | 

我想編寫一個查詢將返回user.id,用戶.pin,user_purchase.date用於在過去13個月內未進行購買的ACTIVE用戶。

我曾嘗試如下編寫查詢:

SELECT max(date) AS mdate, `user_id` , `users`.`pin` 
FROM `users_purchases` 
INNER JOIN `users` ON `users_purchases`.`user_id` = `users`.`id` 
WHERE `users`.`active_ind` = 'Y' 
AND `users`.`biz_id` = NULL 
GROUP BY `users`.`pin` 
HAVING mdate < DATE_SUB(CURDATE() , INTERVAL 13 
MONTH) 

,但我懷疑是不是這樣做的正確方法。

有人可以請這個幫助,最重要的是解釋爲什麼正確的做法其實是正確的 - 我真的很想明白這一點。謝謝!

+0

是您的日期字段的日期或字符串?因爲字符串應該有ANSI格式'yyyy-mm-dd' –

+0

是的日期是一個適當的時間戳。只是急着寫了。現在就做出改變。 – ackerchez

+0

爲什麼你有'users.biz_id = NULL'? –

回答

1
SELECT 
    u.id, 
    u.pin, 
    max(up.date) mdate 
FROM 
    User u 
    LEFT JOIN User_Purchase up ON u.Id = up.user_id 
WHERE 
    u.active_ind = 'Y' 
    and u.biz_id IS NULL 
GROUP BY 
    u.id, 
    u.pin 
HAVING 
    mdate IS NULL or 
    mdate < DATE_SUB(CURDATE() , INTERVAL 13 MONTH) 

可以去掉的mdate IS NULL or如果你只是想究竟是誰13個月前

購買產品的用戶

SQL Fiddle

0

這是不正確的,因爲內部連接users_purchases會自動篩選出從未進行任何購買的用戶。

select distinct a.id, a.pin 
from users a 
left join users_purchases b on a.id = b.user_id and b.mdate >= curdate() - interval 13 month 
where a.active_ind = 'Y' and a.biz_id is null and b.id is not null; 

在這裏,我們在過去13個月內對任何購買都使用了左連接。由於左連接,每個用戶都會有一行。對於在13個月內購物的用戶,users_purchases.id不會爲空,我們會在where語句中用b.id is not null進行過濾。

+0

當我嘗試運行,我得到日期字段(我想選擇)返回NULL。爲什麼會這樣? – ackerchez

+0

@ackerchez,您想要返回哪個日期?最近的購買日期?對於從未購買過的用戶,我們是否顯示爲空? – Fabricator

0

我會先按照日期過濾用戶,然後按其他字段(我認爲這些字段不太可能失敗,我的意思是,大多數用戶將會活躍),然後獲取您想要顯示的字段。我通常是從一個單獨的東西JOIN其他,因爲它也是更易懂

SELECT user_last_purchase.mdate, u.pin, u.id 
FROM 
(

    SELECT max(date) AS mdate, user_id 

    FROM users_purchases 

    GROUP BY user_id 

) user_last_purchase 

RIGHT JOIN users u 
ON u.id = user_last_purchase.user_id 

WHERE `users`.`active_ind` = 'Y' 
AND `users`.`biz_id` = NULL 
AND user_last_purchase.mdate < DATE_SUB(CURDATE() , INTERVAL 13 MONTH) 
0

在查詢中的錯誤是users.biz_id = NULL應該users.biz_id IS NULL

SQL Fiddle Demo

SELECT max(p_date) AS mdate, u.`id` , u.`pin` 
FROM users u 
JOIN user_purchases up 
    ON u.`id` = up.`user_id` 
WHERE u.`active_ind` = 'Y' 
    AND u.`biz_id` IS NULL 
GROUP BY u.`pin` 
HAVING mdate < Date_sub(Curdate(), INTERVAL 13 month) ; 

還有改進的餘地。

與使用left join一樣無需購買即可返回新用戶。但是你的數據沒有。

使group by爲選擇列表上的每個字段,但mySql允許您的格式,即使當isnt ANSI。

GROUP BY u.`id` , u.`pin`