2015-02-09 3 views
1

Возьмем следующую таблицу:Как мне группировать только последние строки `n`?

id - member_id - day 

0  1   1 
1  1   1 
2  1   2 
3  2   2 
4  1   3 
5  2   3 
6  2   3 
7  1   3 
8  1   3 
9  2   3 

Допустим, я хочу сделать что-то вроде:

SELECT `day`, 
    COUNT(`id`) AS `count` 
FROM `table` 
WHERE `member_id` = 1 
GROUP BY `day` 
ORDER BY `day` DESC 
LIMIT 5 

и я ожидал, результат, как:

day - count 
3  3 
2  1 
1  1 

Обратите внимание, как счетчик на день 1 разрезается пополам, так как только самые последние пять строк для этого члена сгруппированы. Вместо этого я получаю последние пять групп, упорядоченных по дням.

Как сгруппировать только последние строки n с условием WHERE?

Фактически, я хочу использовать WHERE, затем LIMIT и только затем GROUP.

+0

Вы выбираете день из запроса. Это все, что я знаю. –

+0

Я не совсем понимаю, знаете ли вы о 'HAVING' clause? –

+0

@LuisSiquot Я не вижу, как 'HAVING' получает самые последние строки' n' для данного члена ..? –

ответ

3

Я думаю, что вы хотите использовать подзапрос с limit:

SELECT `day`, COUNT(`id`) AS `count` 
FROM (SELECT t.* 
     FROM `table` t 
     WHERE `member_id` = 1 
     ORDER BY `day` DESC 
     LIMIT 5 
    ) t 
GROUP BY `day` 
ORDER BY `day` DESC; 
+0

Я не мог изначально получить подзапрос, чтобы работать, я понимаю, что у меня, возможно, не было предложения WHERE. –

Смежные вопросы