我需要找到用户第一次在网站上存款的数据,我有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中的相关数据)。
感谢所有的建议!
答案 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'
上查看
答案 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
如果任何假设错误,则需要相应地调整查询。