0

私は私のテーブルに持っています:

ID Name   Age
1  James  15
2  James  16
3  Joseph 16
4  Joseph 18
5  Steve  4

そして私は戻りたい:

5 Steve 4
1 James 15
3 Joseph 16

すなわち。名前の行に基づく一意のエントリ (同じ名前が複数ある場合は ID が最も小さいものを選択)、年齢順に並べ替えます

正しい SQL ステートメントは何ですか?

私は持っている:

Select * FROM table Where True GROUP BY Name ORDER BY Age

多くの一意の結果が返されているようですが、遅すぎます (テーブルに 250,000 エントリがあり、処理に 30 秒以上かかります)。

4

3 に答える 3

0

これをクエリする別の方法。通常、パフォーマンスが必要な場合は、次のインデックスがあれば(ここではオプションではありません)、より適切ですName

SELECT *
FROM your_table t1
LEFT JOIN your_table t2 ON t1.Name = t2.Name AND t2.ID < t1.ID
WHERE t2.ID IS NULL;

ここで簡単な説明

于 2012-06-27T06:59:18.463 に答える
0

ID一意のフィールドであるminimum に基づいて選択する必要があるため、ID最初に名前ごとに最小の を取得してから、それらIDの をメイン テーブルに結合するだけです。WHEREこれは、サブクエリがメイン テーブルの各行に対して実行されるのに対し (250,000 回以上!)、最小値のサブ選択が 1 回だけ実行されるため、サブクエリを使用するよりもはるかに高速です。

SELECT
    b.*
FROM
    (
        SELECT MIN(ID) AS minID
        FROM tbl
        GROUP BY Name
    ) a
INNER JOIN
    tbl b ON a.minID = b.ID
ORDER BY
    b.Age
于 2012-06-27T08:00:23.993 に答える
0

これを試して

SELECT *
FROM table WHERE ID in (SELECT MIN(ID) FROM table group by name)
ORDER by age

データセットを名前でグループ化し、MIN(ID)これを選択の「場所」条件として取得して使用するだけです

于 2012-06-27T06:54:19.307 に答える