2013-12-09 2 views
0

Имея структуру, как так:Выберите строки с HAVING после указанной даты

+----+------------+--------+-----------+ 
| 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 и подтверждено ряд после 2013 года -06-06 - этот пользователь должен быть включен в выбора

пользователя 2 имеет проверенных строк до 2013-06-06 и подтверждено после того, как строка 2013-06-06 - этот пользователь должны быть включены в выборе

пользователя 3 имеет 5 проверенных строк до 2013-06-06 - это пользователь не должно быть включен в избранных.

Пользователь 4 имеет 5 утвержденных строк после 2013-06-06 - этот пользователь должен быть включен в выбор.

Надеюсь, это достаточно ясно, по сути, я хочу, чтобы пользователи имели только 5 проверенных строк после определенной даты, но включают строки до этой даты, если у пользователя еще не было 5 проверенных строк.

+0

Что вы говорите, вы хотите, чтобы пользователи с 5 проверенных строк, по крайней мере, один из которых после указанной даты? – Matt

+0

Просто таблица сама по себе НАСТОЯЩЕЕ СОСТОЯНИЕ – Strawberry

ответ

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' 
0

Ну, чтобы упростить вашу проблему, вы хотите, чтобы выбрать кого-то, если она имеет 5 валидацию и она имеет какой-либо Validate после определенной даты.

Затем вы можете использовать:

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 
Смежные вопросы