给出以下SQL表:
CREATE TABLE [dbo].[posts]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[user_id] [int] NOT NULL,
[date_posted] [datetime] NOT NULL,
[date_modified] [datetime] NOT NULL,
[content] [text] NOT NULL,
CONSTRAINT [PK_posts] PRIMARY KEY CLUSTERED ( [id] ASC )
)
如何为每位用户检索最近修改过的帖子的帖子ID?
答案 0 :(得分:1)
您可以使用row_number()
select * from (
select * ,
row_number() over (partition by user_id order by date_modified desc) rn
from posts
) t1 where rn = 1
编辑看来你正在使用mysql,它不支持row_number()
。您可以使用not exists
代替
select * from posts p1
where not exists (
select 1 from posts p2
where p2.user_id = p1.user_id
and p2.date_modified > p1.date_modified
)
旁注
Select * from posts GROUP BY user_id Order by date_modified desc
上面的查询可能看起来有效,但它实际上不可靠,因为您无法通过order by
影响组中哪一行返回。
https://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html
MySQL扩展了GROUP BY的使用,以便选择列表可以引用 未在GROUP BY子句中命名的非聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序来获得更好的性能 分组。但是,这主要适用于每个中的所有值 GROUP BY中未命名的非聚合列对于每个列都是相同的 组。服务器可以自由选择每个组中的任何值,所以 除非它们相同,否则所选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER BY子句的影响。对结果集进行排序 选择值后发生,ORDER BY不影响 服务器选择的每个组中的值。
答案 1 :(得分:0)
试试这个
Select
Id
,[User_id]
,[Date_Posted]
,[Date_Modified]
,[Content]
From [dbo].[posts] posts
where date_modified = (select Max(date_modified) from posts2
where posts.[User_id] = posts2.[User_id])
答案 2 :(得分:-1)
我就是这样做的。
Select * from dbo.posts where user_id = ? Order by date_modified desc limit 1