SQL - 检索最近修改过的帖子的ID

时间:2014-09-25 20:21:19

标签: sql

给出以下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?

3 个答案:

答案 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