有这样的结构:
+----+------------+--------+-----------+
| 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个经过验证的行,则包括该日期之前的行。
答案 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