MySQL - 计算与最近访问相关的事务

时间:2013-03-21 00:16:39

标签: mysql sql group-by

假设我在同一个MySQL DB中有两个表:

第一个是inbound_campaign_visit表。它看起来像这样。

+----+-----------+------------------+---------------------+
| id | user_id   | inbound_campaign | date                |
+----+-----------+------------------+---------------------+
|  1 |         1 |                1 | 2013-02-18 13:00:00 |
|  2 |         1 |                2 | 2013-02-24 13:00:00 |
|  3 |         2 |                3 | 2013-01-01 01:00:00 |
|  4 |         2 |                2 | 2013-02-24 19:00:00 |
+----+-----------+------------------+---------------------+

每次用户因点击促销广告系列而访问我的网站时,都会生成此表格中的一行。 “日期”列表示他们来到网站的时间。

第二个表是我的交易表。

+--------+---------+---------------------+
| id     | user_id |    creation_date    |
+--------+---------+---------------------+
| 321639 |       1 | 2013-02-18 14:00:00 |
| 321640 |       1 | 2013-02-24 15:00:00 |
| 321641 |       1 | 2013-02-25 13:00:00 |
| 321642 |       1 | 2013-04-05 12:00:00 |
| 321643 |       2 | 2013-01-01 12:00:00 |
| 321644 |       2 | 2013-02-23 12:00:00 |
+--------+---------+---------------------+

只要事务发生,就会创建此表上的一行。 “creation_date”列表示交易发生的时间。

我想创建一个报告,计算每个入站广告系列的交易数量。必须遵守以下规则:

  1. 如果user_id值与事务的值匹配且事务发生在创建inbound_campaign_visit行的30天内,则认为事务与入站广告系列相关。
  2. 交易只能应用于给定用户的最新入站campaign_visit。
  3. 结果表应如下所示:

    +------------------+-------------------+
    | inbound_campaign | transaction_count |
    +------------------+-------------------+
    |                1 |                 1 |
    |                2 |                 2 |
    |                3 |                 1 |
    +------------------+-------------------+
    

    请注意,事务321644和321642不计入,因为它们失败了规则1.还要注意事务321641仅适用于inbound_campaign 2而不是inbound_campaign 1(即使两个广告系列都属于规则1中定义的30天限制)。 / p>

    我一直在努力解决这个问题,所以任何帮助都会受到赞赏。当然我可以在代码中执行此操作,但必须有一种方法可以在SQL中执行此操作。 TIA。

1 个答案:

答案 0 :(得分:0)

SELECT  a.inbound_campaign,
        COUNT(b.user_ID) TotalCount
FROM    inbound_campaign_visit a
        LEFT JOIN transaction b
            ON a.user_ID = b.user_ID AND
               DATEDIFF(CURDATE(), b.creation_date) > 30
GROUP   BY a.inbound_campaign