SQL中的循环?或者可以使用set函数完成循环?

时间:2012-03-07 13:30:21

标签: mysql sql

我想知道给定下表结构的每个新用户的0-30天收入。希望在过去30天内排除任何收入。

Table A有两个属性:idcreatedate。这是用户表,每个新用户都可以在其创建的位置放入此处。 Table B有三个属性:useridrevenueorderdate。此表记录订单日期发生的每个订单。

我对SQL的了解真的很生疏,所以我能想到的唯一方法就是使用循环。但是,如果我记得我的数据库类中的任何内容,那就是永远不要使用循环。你们都在想什么?

3 个答案:

答案 0 :(得分:2)

您需要查看特定数据库中的datetime语法,但在MySQL中:

SELECT SUM(revenue) as month_revenue
FROM b
WHERE orderdate > (CURDATE() - INTERVAL 30 DAYS)

[编辑]

这仅适用于单个用户,使用表b。要对两个表格进行完整的查询,我们会更加异国情调。

SELECT a.id as userid, SUM(b.revenue) as revenue
FROM a
INNER JOIN b on a.id = b.userid
WHERE orderdate > (CURDATE() - INTERVAL 30 DAYS)
GROUP BY a.id

我们正在对这两个表进行连接,因此我们得到一个结构为(id, createdate, userid, revenue, orderdate)的虚拟表,并为 b 中的每个条目创建一条记录。除了指出它在那里之外,WHERE是自我解释的。 GROUP BY将它们分成不同的用户ID,并且总和适用于这些组。

答案 1 :(得分:2)

尝试:

select a.id, sum(b.revenue) `0-30 days revenue`
from a
left join b on a.id = b.userid and 
               b.orderdate <= date_add(a.createdate, interval 30 day)
group by a.id

答案 2 :(得分:0)

这可以在没有循环的情况下轻松完成:

   SELECT a.id AS userid,
          SUM(b.revenue) AS revenue
     FROM a
LEFT JOIN b
       ON a.id = b.userid
    WHERE (b.orderdate - a.createdate) < 2592000
       OR (b.orderdate - a.createdate) IS NULL
 GROUP BY a.id

2592000是30天的秒 - 我假设您使用unix时间戳作为日期字段。