如何检查当前行是否是SQL查询中最后选择的行?

时间:2015-03-30 22:25:29

标签: mysql sql database

我有一个简短的问题!我选择的行数如下所示:

SELECT * FROM ... WHERE ... GROUP BY ...

我想在结果集中添加另一个字段/属性,比方说last,它确定当前行是否是结果集中的最后一行。我想结果集如下所示?

id    name   last
---   ----   ----
12    foo    false
20    smth   false
27    bar    true

2 个答案:

答案 0 :(得分:1)

  1. 您必须指定ORDER BY来定义行的某些排序。
  2. 我相信MySQL的任何解决方案都会有效地意味着您的查询至少执行了两次,所以最好在客户端上执行它。
  3. 如果您可以两次运行相同的查询,那么请执行以下操作。

    首先获取最后一行的ID:

    SELECT @LastID := ID 
    FROM ... 
    WHERE ... 
    GROUP BY ...
    ORDER BY ID DESC
    LIMIT 1;
    

    在主查询中使用该ID:

    SELECT * 
        , CASE WHEN ID = @LastID THEN FALSE ELSE TRUE END AS IsLast
    FROM ... 
    WHERE ... 
    GROUP BY ...
    ORDER BY ID ASC;
    

    按原样,如果在运行这两个查询时更新表,则很可能会中断(如果添加或删除行,则记住的ID可能不会是最后一个,除非您采取措施解决此问题)。

    当然,您可以将其全部放入一个查询中:

    SELECT 
        *, 
        CASE WHEN ID = LastID THEN FALSE ELSE TRUE END AS IsLast
    FROM 
        YourTable
        CROSS JOIN 
        (
            SELECT ID AS LastID
            FROM YourTable
            ORDER BY ID DESC
            LIMIT 1
        ) AS TableLastID
    ORDER BY ID ASC;
    

    你需要检查MySQL是否足够聪明,只运行内部SELECT LIMIT 1一次,否则它将为主表的每一行运行它。尽管如此,即使在最好的情况下,查询也会有效地执行两次。

答案 1 :(得分:1)

您需要有一个排序顺序才能确定最后一条记录。使用ASC排序顺序的MAX()函数或DESC的MIN(),可以测试相等性,以确定排序顺序字段的值是否是结果集中最后一条记录的值,至少当排序字段是独特的钥匙。例如,在您的查询中,看起来排序顺序位于ID字段上,通常是唯一的密钥。

SELECT id,field1,field2,id = MAX(id)AS last_record FROM my_table ORDER BY id ASC;