以下に示すデータベースレコードがあります。
id | dataId | value
1 | 1 | xxx
2 | 1 | xx1
3 | 1 | xx2
4 | 1 | xx1
5 | 2 | yyy
6 | 2 | yy1
7 | 2 | yy2
8 | 1 | zzz
9 | 2 | yy3
私の望む結果は次のようになります
id | dataId | value
8 | 1 | zzz
4 | 1 | xx1
3 | 1 | xx2
9 | 2 | yy3
7 | 2 | yy2
6 | 2 | yy1
dataIdごとにN個の最新IDを選択したい。この場合のNは3
前もって感謝します。
これは、グループから選択した数のアイテムを取得するために参照できる興味深い記事です。この質問から見つけることができます。
各データIDの最新の3つのIDを取得するには、次のクエリを使用できます。
SELECT id, dataid, value, date
FROM myTable m
WHERE(
SELECT COUNT(*) FROM myTable mt
WHERE mt.dataid = m.dataid AND mt.id >= m.id
) <= 3;
つまり、where句のサブクエリは最大のid値をフィルタリングし、3以下に制限できWHERE mt.dataid = m.dataid
ます。これが行のグループ化に使用されていることに注意してください。
記事が示唆しているように、これは最も効率的な方法ではありませんが、それを書くためのクリーンな方法です。おそらくより効率的な方法は、各クエリでUNIONを個別に使用することです。詳細については、記事を参照してください。次のようになります。
(SELECT * FROM myTable WHERE dataid = 1 ORDER BY id DESC LIMIT 3)
UNION ALL
(SELECT * FROM myTable WHERE dataid = 2 ORDER BY id DESC LIMIT 3)
これが両方の例のSQLフィドルです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加