mysql - SELECT 任意记录组的最新记录(忽略只有一条记录的记录)

标签 mysql sql greatest-n-per-group

查询时遇到问题,无法返回具有 1 个以上订单的任何分组订单集的最新订单。下面是测试数据的创建和插入。

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

从 orderTable GROUP BY customer_id 中选择 COUNT(customer_id)、customer_id、GROUP_CONCAT(order_id),其中 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的表结构

如果不存在则创建表orderTable ( customer_id varchar(10) NOT NULL, order_id varchar(4) NOT NULL, date_add 日期不为空, 主键(customer_idorder_id) ) ENGINE=MyISAM 默认字符集=latin1;

--

--转储表orderTable

的数据

插入orderTable(customer_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');

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

最佳答案

澄清查询。 问题是只包括那些有更多订单的客户...因此我的查询将其包含在 GROUP BY 中...这样它只提供有多个订单的相关客户,但同时只提供该人最后一个订单的最近日期...然后,预查询通过公共(public)客户 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

关于mysql - SELECT 任意记录组的最新记录(忽略只有一条记录的记录),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6217879/

相关文章:

mysql - 复杂选择说明

mysql - 为什么这个字符串比较mysql查询没有返回任何内容?

sql - 在触发器函数中,如何获取正在更新的字段

sql - 如何在查询多个表的多列时从单个表的单列使用MAX

mysql - 如何在 Mac 上使用 DbLinq SqlMetal for MySQL?

mysql选择具有B列和相关列C的最小值的不同列A

python - Django 插入数据文件位置

mysql - SQL返回列的总和

用于查找最近创建的具有相同列值的行的 SQL 查询

php - Doctrine 查询语言获取每组最大/最新行