下面是建立一個查詢來獲取特定結果的一種方式。
從獲取每個用戶「存款」的「最早」日期開始。假設action_date
或者是一個MySQL DATE,DATETIME或TIMESTAMP數據類型,或其他數據類型,它是規範格式的,這樣說:「前面」,「後面的」日期排序之前日期:
SELECT d.user_id
, MIN(d.action_date) AS earliest_deposit_date
FROM table_2 d
GROUP BY d.user_id
如果有區分一個其他標準從其他行爲「存款」,例如一個非負和非零存款量,添加的是,在該查詢WHERE
子句,假設deposit_amount
是數值,例如:
SELECT d.user_id
, MIN(d.action_date) AS earliest_deposit_date
FROM table_2 d
WHERE d.deposit_amount > 0
GROUP BY d.user_id
接下來,檢查「earliest_deposit_date」爲每個用戶是否是內通過將此查詢引用爲內嵌視圖來指定範圍。假設action_date
是一個MySQL DATE,DATETIME或TIMESTAMP數據類型,到2014年4月內檢查最早的存款日期:
SELECT e.user_id
, e.earliest_deposit_date
FROM (SELECT d.user_id
, MIN(d.action_date) AS earliest_deposit_date
FROM table_2 d
WHERE d.deposit_amount > 0
GROUP BY d.user_id
) e
WHERE e.earliest_deposit_date >= '2014-04-01'
AND e.earliest_deposit_date < '2014-04-01' + INTERVAL 1 MONTH
ORDER BY e.user_id
要同時從「用戶」表中檢索值,添加一個JOIN操作。假設user_id
處於「用戶」表的唯一(或主)鍵,並假定在TABLE_2 user_id
「匹配」 USER_ID在「用戶」表:
SELECT e.user_id
, e.earliest_deposit_date
, u.id
, u.user_id
, u.user_name
, u.registration_date
FROM (SELECT d.user_id
, MIN(d.action_date) AS earliest_deposit_date
FROM table_2 d
WHERE d.deposit_amount > 0
GROUP BY d.user_id
) e
JOIN table_1 u
ON u.user_id = e.user_id
WHERE e.earliest_deposit_date >= '2014-04-01'
AND e.earliest_deposit_date < '2014-04-01' + INTERVAL 1 MONTH
ORDER BY e.user_id
如果任何假設是錯誤的,該查詢將需要相應調整。
我試過了你的查詢但我在WHERE子句中發現錯誤「無效使用組功能」 – user3708819
@ user3708819我糾正了查詢,我在sqlfiddle中發佈了一個例子 –
嗨,是的,我不得不修改查詢a雖然很少,但它的效果與斯賓塞提出的一樣,我選擇了你的,因爲它更小巧,更通用。 順便說一句,這兩個答案帶我正確的方向,謝謝你們兩個! P.S.爲了得到正確的結果,我必須在分組 – user3708819