0

たとえば、このテーブルが与えられた

id | カテゴリー

1 | 10

2 | 10

3 | 10

4 | 10

5 | 20

6 | 20

7 | 20

8 | 30

9 | 30

10 | 30

11 | 30

各カテゴリから最初の2つの小さなIDを取得する必要があります。つまり、この結果が必要です。

1

2

5

6

8

9

私はこの質問と彼の作品を書きます

        SELECT MIN(id) AS id FROM mytable GROUP BY category  
        UNION 
        SELECT MIN(id) AS id FROM mytable WHERE 
        id NOT IN (SELECT MIN(id) AS id FROM mytable GROUP BY category) GROUP BY category

        ORDER BY id

ただし、ここに1つの問題があります。これは、各カテゴリの最初の2つのIDが必要な場合に機能しますが、各カテゴリの最初の小さなID(たとえば、7)が必要な場合、クエリは非常に困難になります。誰かがアイデアを持っています、どうすればこれを簡単にすることができますか?

4

2 に答える 2

2

@Quassnoiは、このテーマについて非常に有益なブログ記事をいくつか書いています。以下に複合インデックスがある場合、以下は非常にパフォーマンスが高いと結論付けています(category, id)

SELECT mytable.*
FROM   mytable JOIN (
  SELECT category, (
    SELECT   id
    FROM     mytable
    WHERE    mytable.category = categories.category
    ORDER BY id
    LIMIT    1, 1
  ) AS id
  FROM (
    SELECT DISTINCT category
    FROM   mytable
  ) AS categories
) AS limits ON mytable.category  <= limits.category
           AND mytable.category  >= limits.category
           AND IFNULL(mytable.id <= limits.id, TRUE)

sqlfiddleでそれを参照してください。

最初の4つのレコードを選択するには、に変更LIMIT 1,1LIMIT 3,1ます。より一般的には、最初のnレコードを選択するには、に変更LIMIT 1,1します。LIMIT n-1,1

于 2012-09-17T09:48:13.467 に答える
1

各グループの上位Nを見つけるには、次のガイドを試してください:http ://thenoyes.com/littlenoise/?p=36

于 2012-09-16T19:10:15.597 に答える