在WHERE条件下选择MySQL中的最后一条记录

时间:2019-12-14 09:32:29

标签: mysql sql

我有一张桌子,上面存储着门票和雕像的关系

ticketstatus_Id ticket_Id status_Id
===================================
1                1          1
2                1          2
3                1          3
4                2          1
5                2          2   *
6                3          1
7                4          1
8                3          2   *

我要选择最后一个status_Id等于2的行,表中标记了行。  我认为我必须在ticket_Id列上使用GROUP BY,但它会返回第一个status_Id。

4 个答案:

答案 0 :(得分:1)

此问题很适合ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ticket_Id ORDER BY ticketstatus_Id DESC) rn
    FROM yourTable
)

SELECT ticketstatus_Id, ticket_Id, status_Id
FROM cte
WHERE rn = 1 AND status_Id = 2;

上述逻辑按ticket_Id的顺序查找每个ticketstatus_Id的所有最新行,status_Id的值也恰好是2。

答案 1 :(得分:0)

所有带有status_Id= '2'的记录

Select * from TABLENAME where status_Id = '2'

最近记录为status_Id= '2'

Select * from TABLENAME where status_Id = '2' order by  ticketstatus_Id  desc limit 1

答案 2 :(得分:0)

TABLENAME中选择*,其中status_Id ='2'ORDER BY ticketstatus_Id DESC LIMIT 1;

答案 3 :(得分:0)

您可以使用yarn shadow-cljs watch app group by子句来做到这一点:

having

很有趣的是,它是否比select ticket_Id, max(ticketstatus_Id) from ticketstatuses group by ticket_id having max(ticketstatus_Id) = max(case when status_id = 2 then ticketstatus_Id end); 版本具有更好的性能。但是,出于性能考虑,这可能是最好的:

row_number()

这可以利用select ts.* from ticketstatuses ts where ts.ticketstatus_Id = (select max(ts2.ticketstatus_Id) from ticketstatus ts2 where ts2.ticket_id = ts.ticket_id ) and ts.status_id = 2; 上的索引。