-1

我不太擅长(我的)SQL,所以这里有一个表格和一个问题。我用表格来保存历史。我想返回最近的完整行(*)并且field1. 如果没有这样的行,我想获取任何field1为 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 |

我想得到三行,因为有三个不同的field2值。我想要标有“a”的行,因为它们是最新的并且具有非 NULL field1。而且我想要两个'b'-'中的一个(对我来说哪个没关系)。共制作三个。

我尝试了如下声明:

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 回答