-1

私は(my)SQLがあまり得意ではないので、ここに表と質問があります。テーブルを使用して履歴を保持します。最新(*)で、。の値がNULL以外の完全な行を返したいのですがfield1field1そのような行がない場合は、 NULLであった行のいずれかを取得したいと思います。

*)最近の意味では、最も高くなっていますid(以下の「a」-)。

表と例:

| id | field1 | field2 |
------------------------
|  1 | (null) |     34 | <--b 
|  2 |     77 |   1234 |
|  3 | (null) |   1234 |
|  4 | (null) |    234 |
|  5 | (null) |     34 | <--b
|  6 |     99 |   1234 |
|  7 |     42 |   1234 | <--a
|  8 |     13 |    234 | <--a
|  9 | (null) |    234 |

3つの異なる値があるため、3つの行を取得したいと思いfield2ます。'a'でマークされた行は最新であり、NULL以外であるため、必要field1です。そして、2つの「b」-のうちの1つが欲しいです(どちらが私にとっては問題ではありません)。全部で3つになります。

私は次のようなステートメントを試しました:

SELECT MAX(id), field1, field2
FROM table1
GROUP BY field2;

しかし、それでは望ましい結果は得られません。

4

1 に答える 1

1
SELECT t.*
FROM 
        ( SELECT DISTINCT field2
          FROM table1
        ) AS dt
    JOIN
        table1 AS t
            ON t.id = COALESCE(
                ( SELECT MAX(id) AS maxid
                  FROM table1
                  WHERE field2 = dt.field2
                    AND field1 IS NOT NULL 
                ),
                ( SELECT MAX(id)
                  FROM table1
                  WHERE field2 = dt.field2
                ) 
                              ) ;

別の方法:

SELECT t.*
FROM 
        ( SELECT DISTINCT field2
          FROM table1
        ) AS dt
    JOIN
        table1 AS t
            ON t.id = 
               ( SELECT id
                 FROM table1
                 WHERE field2 = dt.field2
                 ORDER BY (field1 IS NULL)
                        , id DESC
                   LIMIT 1
               ) ;

(あなたの)SQL-Fiddleでテスト済み

于 2013-01-21T15:21:53.500 に答える