Получить N на группу MYSQL
ЭТО НЕ ТАКОЙ ВОПРОС, ЧЕМ: Используя LIMIT внутри GROUP BY, чтобы получить N результатов для каждой группы?
но я допускаю, что это похоже.
Мне нужно выбрать первые 2 строки на человека.
строки упорядочиваются по Полученному году
Проблема: есть вероятность, что в тот же месяц были введены 2 данных (дата введена в ГГГГ-ММ)
Запрос, который я пришел с (по указанному вопросу), застревает в цикле BIG.
SELECT *
FROM `table_data` as b
WHERE (
SELECT count(*) FROM `table_data` as a
WHERE a.Nom = b.Nom and a.year < b.year
) <= 2;
Пример данных:
A | year | Nom
---------------------
b | 2011-01 | Tim
---------------------
d | 2011-01 | Tim
---------------------
s | 2011-01 | Tim
---------------------
a | 2011-03 | Luc
---------------------
g | 2011-01 | Luc
---------------------
s | 2011-01 | Luc
При экспорте:
A | year | Nom
---------------------
b | 2011-01 | Tim
---------------------
d | 2011-01 | Tim
---------------------
a | 2011-03 | Luc
---------------------
g | 2011-01 | Luc
Ответы
Ответ 1
(
-- First get a set of results as if you only wanted the latest entry for each
-- name - a simple GROUP BY from a derived table with an ORDER BY
SELECT *
FROM (
SELECT *
FROM `table_data`
ORDER BY `year` DESC
) `a`
GROUP BY `Nom`
)
UNION
(
-- Next union it with the set of result you get if you apply the same criteria
-- and additionally specify that you do not want any of the rows found by the
-- first operation
SELECT *
FROM (
SELECT *
FROM `table_data`
WHERE `id` NOT IN (
SELECT `id`
FROM (
SELECT *
FROM `table_data`
ORDER BY `year` DESC
) `a`
GROUP BY `Nom`
)
ORDER BY `year` DESC
) `b`
GROUP BY `Nom`
)
-- Optionally apply ordering to the final results
ORDER BY `Nom` DESC, `year` DESC
Я уверен, что есть более короткий способ сделать это, но сейчас я не могу, чтобы жизнь меня работала над тем, что это такое. Это работает, хотя - если у вас есть первичный ключ (что вам нужно) и что он называется id
.