0

行を日付でソートします。最後の列に一意の値を持つすべての行を選択したい場合、SQL でこれを行うことはできますか?

したがって、最初の行を選択し、2 番目の行を選択し、3 番目の行を選択せず​​、4 番目の行を選択したいと考えています。

ここに画像の説明を入力

4

3 に答える 3

3

必要なのは一意の行ではなく、グループごとに 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
于 2012-05-08T12:47:58.550 に答える
2

これはマイケルの答えに似ていますが、サブクエリの代わりに自己結合で行います。試して、どのように機能するかを確認してください。

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

適切なインデックスがある場合、このタイプの結合はしばしばサブクエリを実行します (派生テーブルはインデックスを使用しないため)。

于 2012-05-08T12:57:55.600 に答える
-1

この非標準の 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
于 2012-05-08T12:48:50.903 に答える