这几天在查询购买记录,其中一个需求就是查出来客户首次购买的产品时间和产品名称。说白了,就是在一段时间内,去取出来用户的第一次购买记录,再清楚一些就是在一堆重复的记录中取出第一条购买记录。
这个问题捉只让我困扰了一段时间,自己最存储过程还是不能驾轻就熟,所以还是得按照传统的方法来进行查询了。
要查询的记录如下:
而我们要取出来的记录如下:
事实上,这样的记录如果取出来第一条记录还是比较好取的,因为这里面有购买时间,我们可以根据购买时间,来取出首次购买的记录。同一个用户,购买的时间最早的,就是首次购买产品。
mysql> select account,itemid,buytime from testdup
-> where buytime in (select min(buytime)
-> from testdup group by account);
得到的结果如下
+-------------+----------+---------------------+
| account | itemid | buytime |
+-------------+----------+---------------------+
| zoinzone | 2686977 | 2011-06-25 18:15:26 |
| llCoKell | 65599 | 2011-06-14 00:44:36 |
| eventcso010 | 3735553 | 2011-06-23 15:34:33 |
| eventcso004 | 18939907 | 2011-06-24 18:33:35 |
+-------------+----------+---------------------+
4 rows in set (0.00 sec)
此外,还有的情况是,没有这样一个时间的标记项,让我们取出记录中每个重复记录的第一条,我们可以新建一列ID,自动累加,如下:
mysql> select * from testdup;
+----+-------------+----------+---------------------+
| id | account | itemid | buytime |
+----+-------------+----------+---------------------+
| 1 | zoinzone | 655361 | 2011-06-25 18:16:14 |
| 2 | zoinzone | 2686977 | 2011-06-25 18:15:26 |
| 3 | llCoKell | 6691703 | 2011-06-16 19:30:48 |
| 4 | llCoKell | 65599 | 2011-06-14 00:44:36 |
| 5 | eventcso010 | 3735553 | 2011-06-23 15:34:33 |
| 6 | eventcso010 | 3735553 | 2011-06-26 17:24:25 |
| 7 | eventcso004 | 18939907 | 2011-06-24 18:33:35 |
+----+-------------+----------+---------------------+
7 rows in set (0.02 sec)
我们可以通过ID来取出我们想要的记录:
mysql> select * from testdup
-> where id in (select min(id)
-> from testdup group by account);
+----+-------------+----------+---------------------+
| id | account | itemid | buytime |
+----+-------------+----------+---------------------+
| 1 | zoinzone | 655361 | 2011-06-25 18:16:14 |
| 3 | llCoKell | 6691703 | 2011-06-16 19:30:48 |
| 5 | eventcso010 | 3735553 | 2011-06-23 15:34:33 |
| 7 | eventcso004 | 18939907 | 2011-06-24 18:33:35 |
+----+-------------+----------+---------------------+
4 rows in set (0.00 sec)