如何获得第一笔存款

时间:2014-06-04 21:39:53

标签: mysql

我需要找到用户第一次在网站上存款的数据,我有2个表:

表1 有关用户的详细信息

id,user_id,user_name,registration_date,other_anagraphic_data

表2 有关存款和操作的详细信息

id,user_id,action_date,deposit_amount,items,actions

现在,用户可以注册日期(表1中的数据)并在另一个日期(甚至几周后)存款,或者用户可以在同一天存入更多存款或者可以执行某些操作没有存款。 (表2中的数据)

在本月底,我想获得在指定月份内首次存款的用户列表(以及表1中的相关数据)。

感谢所有的建议!

2 个答案:

答案 0 :(得分: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

上查看

答案 1 :(得分: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

还要从&#34;用户&#34;中检索值。表,添加JOIN操作。假设user_id是&#34; user&#34;中的唯一(或主要)键。 table,并假设table_2&#34中的user_id匹配&#34; &#34; user&#34;中的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

如果任何假设错误,则需要相应地调整查询。