mysql查询子选择组

时间:2013-02-16 16:20:03

标签: mysql

我有一张下面描述的表格

mysql> describe payments;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| name           | varchar(128) | NO   |     | NULL    |                |
| email          | varchar(128) | NO   |     | NULL    |                |
| txn_id         | varchar(19)  | NO   |     | NULL    |                |
| payment_status | varchar(20)  | NO   |     | NULL    |                |
| auth           | varchar(40)  | NO   |     | NULL    |                |
| expired_at     | datetime     | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

我可能有两个条目,例如:

name: chris|expires at: 2012-01-01|email: me@chrismuench.com
name: chris|expires at: 2014-01-01|email: me@chrismuench.com

我想根据下载情况查找所有过期用户的查询。但是同一个电子邮件地址可能有多个entires。在上述情况下,此人不应出现在过期的列表中。

好像我想做一个GROUP BY电子邮件但是如果它是>则以某种方式过滤掉过期。 NOW()

2 个答案:

答案 0 :(得分:1)

对于每个唯一身份用户,您希望获得最大日期并检查是否在NOW()之前?所以:

SELECT name, MAX(expired_at) as latest_expired FROM payments WHERE lastest_expired < NOW() GROUP BY name;

答案 1 :(得分:0)

这是你必须要做的。我没有使用日期时间函数,所以你必须仔细检查它是否正确。我只是假设NOW()是一个函数。

找到未过期的用户集,然后从整个用户集中减去它。

select * from table where email not in (select email from table where expired_at > NOW());