n'a pas testé dans des MySQL 4
, mais MySQL 5
cela peut être facilement fait.
Pour que cela fonctionne, vous aurez besoin d'un PRIMARY KEY
dans votre tableau.
SELECT l.*
FROM (
SELECT type,
COALESCE(
(
SELECT id
FROM mytable li
WHERE li.type= dlo.type
ORDER BY
li.type DESC, li.date DESC, li.id DESC
LIMIT 4, 1
), CAST(0xFFFFFFFF AS DECIMAL)) AS mid
COALESCE(
(
SELECT date
FROM mytable li
WHERE li.type= dlo.type
ORDER BY
li.type DESC, li.date DESC, li.id DESC
LIMIT 4, 1
), '9999-31-12') AS mdate
FROM (
SELECT DISTINCT type
FROM t_mytable dl
) dlo
) lo, t_mytable l
WHERE l.type >= lo.type
AND l.type <= lo.type
AND (l.date, l.id) >= (lo.mdate, lo.mid)
Voir cette entrée dans mon blog pour plus de détails sur la façon dont cela fonctionne:
Si vous ne pouvez pas ajouter un PRIMARY KEY
à mettre en œuvre cette solution, vous pouvez essayer d'utiliser une moins efficace en utilisant des variables du système:
SELECT l.*
FROM (
SELECT @lim := 5,
@cg := -1
) vars,
mytable l
WHERE CASE WHEN @cg <> type THEN @r := @lim ELSE 1 END > 0
AND (@r := @r - 1) >= 0
AND (@cg := type) IS NOT NULL
ORDER BY
type DESC, date DESC
Il est décrit ici:
Mise à jour:
Si vous ne souhaitez pas sélectionner 5
enregistrements pour chaque type (qui donnerait 5 x number of types
enregistrements dans l'ensemble de résultats), mais que vous voulez au lieu de sélectionner 5
derniers enregistrements de type distinct (qui donnerait 5
enregistrements dans l'ensemble de résultats), utilisez cette requête:
SELECT date, type, title
FROM mytable m
WHERE NOT EXISTS
(
SELECT 1
FROM mytable mi
WHERE mi.date > m.date
AND mi.type = m.type
)
ORDER BY
date DESC
LIMIT 5
Si vous avez beaucoup de types, ce sera plus efficace que l'utilisation GROUP BY
, à condition que vous avez un index sur date
.
Est-ce que Gummo est supposé avoir '2' pour son type? –
Euh, bon point - corrigé! –