はMySQL 4
ためでテストしていないが、MySQL 5
では、これは簡単に行うことができます。
これを行うには、テーブルにPRIMARY KEY
のようなものが必要です。
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)
それがどのように動作するかの詳細については私のブログでは、このエントリを参照してください:
あなたはこのソリューションを実装するためにPRIMARY KEY
を追加することができない場合は、システム変数を使用して効率の低い1使ってみてください可能性があります。それは、ここで説明しています
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
:
を
更新:
あなたは(結果セットに5
レコードを与えることになる)(結果セットに5 x number of types
レコードを与えるだろう)各タイプの5
レコードを選択したいのですが、代わりに特殊タイプで5
最新のレコードを選択したくない場合は、このクエリを使用します。あなたは種類がたくさんある場合は
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
を、これはGROUP BY
を使用して、あなたはdate
にインデックスを持って提供することがより効率的になります。クエリのパフォーマンスを想定し
Gummoのタイプは「2」ですか? –
まあ、良い点 - 修正! –