选择任何GROUP记录的最新记录(忽略具有一条记录的记录)

时间:2011-06-02 17:21:10

标签: mysql sql greatest-n-per-group

查询无法返回订单超过1个订单的任何分组订单的最新订单。创造&测试数据的INSERT如下所示。

此查询返回我想要使用的唯一客户ID,以及分组的order_id。在这些记录中,我只需要最近的订单(基于date_added)。

SELECT COUNT(customer_id),customer_id,GROUP_CONCAT(order_id)FROM orderTable GROUP BY customer_id HAVING COUNT(customer_id)> 1 LIMIT 10;

mysql> SELECT COUNT(customer_id), customer_id, GROUP_CONCAT(order_id) FROM orderTable     GROUP BY customer_id HAVING COUNT(customer_id)>1 LIMIT 10;
+--------------------+-------------+------------------------+
| COUNT(customer_id) | customer_id | GROUP_CONCAT(order_id) |
+--------------------+-------------+------------------------+
|                  2 | 0487        | F9,Z33                 |
|                  3 | 1234        | 3A,5A,88B              |
+--------------------+-------------+------------------------+
2 rows in set (0.00 sec)

我正在寻找订单Z33(customer_id 0487)和3A(customer_id 1234)。

为了澄清,我不希望订购仅订购一次的客户。

任何有助于我指出正确方向的帮助或提示。

样本表数据:

-

- 表orderTable

的表结构

CREATE TABLE IF NOT NOT EXISTS orderTable(   customer_id varchar(10)NOT NULL,   order_id varchar(4)NOT NULL,   date_added日期非空,   PRIMARY KEY(customer_idorder_id) )ENGINE = MyISAM DEFAULT CHARSET = latin1;

-

- 转储表orderTable

的数据

INSERT INTO orderTablecustomer_idorder_iddate_added)价值观 ('1234','5A','1997-01-22'), ('1234','88B','1992-05-09'), ('0487','F9','2002-01-23'), ('5799','A12F','2007-01-23'), ('1234','3A','2009-01-22'), ('3333','7FHS','2009-01-22'), ('0487','Z33','2004-06-23');

=============================================== ===========

1 个答案:

答案 0 :(得分:1)

澄清查询。 问题是只包括那些拥有更多的客户...因此我的查询将其与GROUP BY一起内部...这样它只会给有问题的客户提供多个订单,但同时,只给出了该人的最后一个订单的最近日期...然后,PreQuery通过公共客户ID重新加入订单表,但仅限于与预先查询中检测到的最后日期匹配的订单。如果客户只有一个订单,其内部PreQuery计数将只有1,因此从最终的PreQuery结果集中排除。

select ot.*
   from
      ( select
            customer_id,
            max( date_added ) as LastOrderDate,
         from
            orderTable
         having 
            count(*) > 1
         group by
            customer_id ) PreQuery
     join orderTable ot
        on PreQuery.Customer_ID = ot.Customer_ID
       and PreQuery.LastOrderDate = ot.date_added