Une requête légèrement modifiée de cet article dans mon blog:
SELECT l.*
FROM (
SELECT category,
COALESCE(
(
SELECT count
FROM mytable li
WHERE li.category = dlo.category
ORDER BY
li.category DESC, li.count DESC, li.id DESC
LIMIT 9, 1
), CAST(-1 AS DECIMAL)) AS mcount
COALESCE(
(
SELECT id
FROM mytable li
WHERE li.category = dlo.category
ORDER BY
li.category DESC, li.count DESC, li.id DESC
LIMIT 9, 1
), CAST(-1 AS DECIMAL)) AS mid
FROM (
SELECT DISTINCT category
FROM mytable dl
) dlo
) lo, mytable l
WHERE l.category >= lo.category
AND l.category <= lo.category
AND (l.count, l.id) >= (lo.mcout, lo.id)
Vous devez créer un index composite sur (category, count, id)
pour que cela fonctionne efficacement .
Notez l'utilisation de l.category >= lo.category AND l.category <= lo.category
au lieu de simple: l.category = lo.category
Ceci est un hack pour faire MySQL
une utilisation efficace Range check for each record