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

Posted

技术标签:

【中文标题】如何检查当前行是不是是sql查询中最后选择的行?【英文标题】:How to check if the current row is the last selected row in a sql query?如何检查当前行是否是sql查询中最后选择的行? 【发布时间】:2015-03-30 22:25:28 【问题描述】:

我有一个简短的问题!我正在选择一些简单的行,如下所示:

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

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

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

【问题讨论】:

【参考方案1】:
    您必须指定ORDER BY 来定义行的某种排序。 我相信任何 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,或者它会对主表的每一行运行它。尽管如此,即使在最好的情况下,查询也会有效地执行两次。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何检查当前行是不是是sql查询中最后选择的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数

SQL 结果中选择的行

如何根据条件更改 DataGridView 的行颜色以检查日期是不是过期

如何在 SQL 查询中仅检查从存储过程返回的行的第一个值

如何正确设计 SQL 查询以实现最优的行输出

如何在 Oracle SQL 中查找最具体的匹配行