最初の画像が最小値の画像でもあり、最後の画像が最大値の画像でもある場合、この MySql クエリは必要なものを正確に返します。
Select ID, min(image) as first_image, max(image) as last_image
From Tbl
Group By ID
それ以外の場合、MySql には集計関数がないためfirst()
、last()
次のようなものを使用できます。
Select
Distinct ID,
(select image from tbl a where a.ID = tbl.ID order by something ASC LIMIT 1) as first_image,
(select image from tbl a where a.ID = tbl.ID order by something DESC LIMIT 1) as last_image,
From tbl
ただし、テーブルをいくつかのフィールドで並べ替える必要があることに注意してください。テーブルをいくつかのフィールドで並べ替えることができない場合、どの値が最初に来てどれが最後に来るかを知る方法はありません.
私はよくこのクエリを目にします。これは見栄えがよく、最初のフィールドを返すことになっています。
Select ID, image
From tbl
Group by ID
これは、通常は機能する非標準の SQL クエリであり、(ほぼ?) 常に最初の画像を正しく返します。しかし、image
is はgroup by
句に含まれておらず、どの集計関数にも関連付けられていないため、サーバーは自由に任意の値を返すことができます。常に最初の値を返すようですが、保証されていないため、使用しないことを好みます。
いくつかの説明:
あなたの例では、最小値は常に最初の値と一致するため、最小値を探しているのか最初の値を探しているのかを例から判断する方法はありません。
これがあなたのデータであるとします:
ID image
=============
A1 a1_02.jpg
A1 a1_01.jpg
A1, a1_01.jpg
最小 ( )を探している場合min(image)
は、まさに必要なものであり、機能します。
A1, a1_02.jpg
しかし、この例では最初のを取得しようとすると、問題が発生します。特定の ORDER BY がないと、行は予測できない方法で返されます。はい、多くの場合/ほとんどの場合、テーブルスペースに物理的に存在する順序で返されますが、これに依存することはできません。
たとえば、この質問と回答を参照してください。
デフォルトのソート順を処理する SQL のベスト プラクティス
これは、行がどのように並べられているかがわからない場合、どれが最初でどれが最後かを判断できないことを意味します。たとえば、次のクエリを参照してください。
Select
Distinct ID,
(select image from tbl a where a.ID = tbl.ID LIMIT 1) as first_image
From tbl
これにより、おそらく探しているものが返されます。ただし、ORDER BY 句を省略したため、常に機能するという保証はありません。また、last_image も削除する必要があることに注意してください。これは、MySql にデフォルトの順序 DESC でテーブルを順序付けするように指示する方法がないためです。このようなデフォルトの順序は存在しないためです。
このクエリは、おそらく最初の画像も返します。
Select ID, image
From tbl
Group By ID
標準 SQL では、select で非集計列を参照することはできませんが、MySql では可能です。そして、おそらくすべての ID の最初の画像を返します。しかし、ドキュメントを見てみましょう:
http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html
「サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。」したがって、サーバーがほぼ常に最初の行を返すという事実は単なる偶然であり、文書化されていません。