在给定日期之后选择具有HAVING的行

时间:2013-12-09 10:14:00

标签: mysql sql

有这样的结构:

+----+------------+--------+-----------+
| id |    date    | userid |  status   |
+----+------------+--------+-----------+
|  1 | 2013-06-05 |      1 | validated |
|  2 | 2013-06-05 |      2 | validated |
|  3 | 2013-06-06 |      2 | pending   |
|  4 | 2013-06-07 |      1 | validated |
|  5 | 2013-06-08 |      1 | validated |
|  6 | 2013-06-08 |      1 | validated |
|  7 | 2013-06-09 |      1 | validated |
+----+------------+--------+-----------+

如果我想选择具有5种验证状态的用户,我可以这样做:

 SELECT userid, COUNT(status) as valid
 FROM table1 
 WHERE status="validated"
 GROUP BY userid
 HAVING valid=5

现在我想提高此查询的复杂性,我想选择从给定日期开始有5个经过验证的行的用户:

 SELECT userid, COUNT(status) as valid
 FROM ladder_offers_actions 
 WHERE status="validated"
 AND date > "2013-06-06"
 GROUP BY userid
 HAVING valid=5

这当然会使用上面给出的示例返回0个用户,这是因为它仅在2013-06-06(4)之后查看经过验证的条目。

我想选择在给定日期之后只有5个经过验证的条目的用户...例如:

用户1在2013-06-06之前有 4 有效行,在2013-06-06之后有 1 有效行 - 此用户应该包含在选择

用户2在2013-06-06之前有 3 有效行,在2013-06-06之后有 2 有效行 - 此用户应该包含在选择

用户3在2013-06-06之前有5个经过验证的行 - 此用户不应包含在选择中。

用户4在2013-06-06之后有5个经过验证的行 - 此用户包含在选择中。

希望这很清楚,基本上我只希望用户在特定日期之后有5个经过验证的行,但如果用户还没有5个经过验证的行,则包括该日期之前的行。

2 个答案:

答案 0 :(得分:3)

如果我理解你在问什么,那么使用子查询怎么样?类似的东西:

SELECT * from (
  SELECT userid, COUNT(status) as valid, MAX(date) as lastdate
  FROM ladder_offers_actions 
  WHERE status="validated"
  GROUP BY userid
  HAVING valid=5
) x WHERE x.lastdate > '2013-06-06'

答案 1 :(得分:0)

为了简化您的问题,您希望选择某人,如果她有5次验证,并且她在某个日期之后有任何验证。

然后你可以使用:

 SELECT userid, COUNT(status) as valid
 FROM ladder_offers_actions 
 WHERE status="validated"
 and userid in 
    (SELECT t2.userid 
    FROM ladder_offers_actions t2
    WHERE t2.date > "2013-06-06")
 GROUP BY userid
 HAVING valid=5