2015-03-30 35 views
1

我有一个简短的问题!我选择的行数一样简单,如下:如何检查当前行是否是sql查询中的最后一个选定行?

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

我想另一个字段/属性添加到结果集,让我们说last,其确定当前行的结果是最后一个组。我希望结果集如下所示?

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

回答

1
  1. 您必须指定ORDER BY定义行的一些排序。
  2. 我相信MySQL的任何解决方案都将意味着您的查询至少执行两次,所以最好在客户端上执行。

如果您可以两次运行相同的查询,则执行如下操作。

获取最后一排的第一个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

您需要有一个排序顺序才能确定最后一条记录。使用ASC排序顺序的MAX()函数或DESC的MIN()函数,可以测试相等性,以确定排序顺序字段的值是否是结果集中最后一条记录的值,至少当排序字段是独特的钥匙。例如,在您的查询中,它看起来像排序顺序是在ID字段上,这通常是一个唯一的键。 SELECT ID,field1,field2,id = MAX(id)AS last_record FROM my_table ORDER BY id ASC;

相关问题