我有一个简短的问题!我选择的行数如下所示:
SELECT * FROM ... WHERE ... GROUP BY ...
我想在结果集中添加另一个字段/属性,比方说last
,它确定当前行是否是结果集中的最后一行。我想结果集如下所示?
id name last
--- ---- ----
12 foo false
20 smth false
27 bar true
答案 0 :(得分:1)
ORDER BY
来定义行的某些排序。 如果您可以两次运行相同的查询,那么请执行以下操作。
首先获取最后一行的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;