行を日付でソートします。最後の列に一意の値を持つすべての行を選択したい場合、SQL でこれを行うことはできますか?
したがって、最初の行を選択し、2 番目の行を選択し、3 番目の行を選択せず、4 番目の行を選択したいと考えています。
行を日付でソートします。最後の列に一意の値を持つすべての行を選択したい場合、SQL でこれを行うことはできますか?
したがって、最初の行を選択し、2 番目の行を選択し、3 番目の行を選択せず、4 番目の行を選択したいと考えています。
必要なのは一意の行ではなく、グループごとに 1 つです。MIN(pk_artikel_Id)
これは、とを使用して実行できますGROUP BY fk_artikel_bron
。このメソッドは、IN
サブクエリを使用して最初の列とpk_artikel_id
それに関連付けられfk_artikel_bron
た一意fk_artikel_bron
の列を取得し、それを使用して外側のクエリの残りの列を取得します。
SELECT * FROM tbl
WHERE pk_artikel_id IN
(SELECT MIN(pk_artikel_id) AS id FROM tbl GROUP BY fk_artikel_bron)
MySQL では最初にリストの残りの列を追加してサブクエリSELECT
を回避するIN
ことができますが、これは実際には他の RDBMS システムに移植できません。この方法はもう少し一般的です。
サブクエリに対しても実行できますがJOIN
、これは高速である場合とそうでない場合があります。それをベンチマークせずに言うのは難しいです。
SELECT *
FROM tbl
JOIN (
SELECT
fk_artikel_bron,
MIN(pk_artikel_id) AS id
FROM tbl
GROUP BY fk_artikel_bron) mins ON tbl.pk_artikel_id = mins.id
これはマイケルの答えに似ていますが、サブクエリの代わりに自己結合で行います。試して、どのように機能するかを確認してください。
SELECT * from tbl t1
LEFT JOIN tbl t2
ON t2.fk_artikel_bron = t1.fk_artikel_bron
AND t2.pk_artikel_id < t1.pk_artikel_id
WHERE t2.pk_artikel_id IS NULL
適切なインデックスがある場合、このタイプの結合はしばしばサブクエリを実行します (派生テーブルはインデックスを使用しないため)。
この非標準の mysql 専用のトリックは、 の各値に対して検出された最初の行を選択しますpk_artikel_bron
。
select *
...
group by pk_artikel_bron
好むと好まざるとにかかわらず、このクエリは要求された出力を生成します。
私はここで叩かれているようですので、免責事項は次のとおりです。
これはmysql 5+でのみ機能します
mysql の仕様では、この手法を使用して返される行は予測できない (つまり、「最初に」遭遇した行として任意の行を取得できる) と書かれていますが、実際、これまでに見たすべてのケースで、次のように最初の行を取得します。したがって、実際に機能する予測可能な行を取得するには(ただし、将来のリリースでは機能しない可能性がありますが、おそらく機能する可能性があります)、順序付けされた結果から選択します。
select * from (
select *
...
order by pk_artikel_id) x
group by pk_artikel_bron