2014-06-04 85 views
0

我需要找到的第一次用戶做出一個網站的押金數據,我有2個表:如何獲得第一存款

表1:細節上的用戶

ID,USER_ID,USER_NAME,REGISTRATION_DATE,other_anagraphic_data

表2:存款細節和行動

ID,USER_ID,ACTION_DATE,DEPOSIT_AMOUNT,項目,一現在,用戶可以註冊一個日期(表1中的數據)並在另一個日期(甚至幾周後)存入存款,或者用戶可以在同一天內進行更多存款,或者它可以做到一些行爲沒有存款。 (表2中的數據)

在本月月底,我想獲得在指定月份內首次存款的用戶名單(以及表1中的相關數據)。

感謝您的所有建議!

回答

0

都需要這樣的

SELECT MIN(B.action_date) as date_deposit, A.* 
FROM user_details A 
INNER JOIN user_deposits B ON (B.user_id = A.user_id) 
WHERE B.deposits > 0 
GROUP BY A.user_id 
HAVING MONTH(date_deposit) = '05' AND YEAR(date_deposit) = '2014' 

查詢見到這對sql fiddle

+0

我試過了你的查詢但我在WHERE子句中發現錯誤「無效使用組功能」 – user3708819

+0

@ user3708819我糾正了查詢,我在sqlfiddle中發佈了一個例子 –

+0

嗨,是的,我不得不修改查詢a雖然很少,但它的效果與斯賓塞提出的一樣,我選擇了你的,因爲它更小巧,更通用。 順便說一句,這兩個答案帶我正確的方向,謝謝你們兩個! P.S.爲了得到正確的結果,我必須在分組 – user3708819

0

下面是建立一個查詢來獲取特定結果的一種方式。

從獲取每個用戶「存款」的「最早」日期開始。假設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 

如果任何假設是錯誤的,該查詢將需要相應調整。

+0

是的,這正是我想要的,謝謝!!! – user3708819