2014-09-25 90 views
1

的ID分配給下面的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?

+0

只是一個簡單的選擇由id,user_id和date_modified組成。雖然我不確定CONSTRAINT。最近修改過的記錄是不是已經升序了? – Hannes 2014-09-25 20:28:38

+0

查看聚合函數,具體是'MAX()' – Tom 2014-09-25 20:31:12

+0

在這種情況下,我需要MAX()嗎?這是我到目前爲止:從帖子中選擇* GROUP BY user_id按日期修改的順序desc – Hannes 2014-09-25 21:23:30

回答

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不影響 服務器選擇的每個組內的值。

+0

我在附近使用了正確的語法對應的手冊得到一個sytnax錯誤 #1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在''附近使用正確的語法'' )t1其中'在第3行 – Hannes 2014-09-25 22:14:14

+0

這個查詢實際上起作用:Select * from posts GROUP BY user_id按date_modified desc排序與您的解決方案相比,有什麼不同? – Hannes 2014-09-25 22:37:22

+0

@Hannes你創建的表語法讓我相信你正在使用sql-server,查看更新 – FuzzyTree 2014-09-25 22:42:57

-1

這就是我會這麼做的。

Select * from dbo.posts where user_id = ? Order  by date_modified desc limit 1 
+0

這僅適用於單個用戶。我如何獲得所有用戶的修改後的帖子? – Hannes 2014-09-25 20:34:01

+0

傳遞一個ID數組而不是user_id =?使用user_id IN? – gamesfreke 2014-09-25 20:36:36

+0

我正在尋找一個解決方案,返回此表中所有用戶的帖子ID – Hannes 2014-09-25 20:38:56

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]) 
+0

這裏還有一個錯誤:#1064 - 你的SQL語法有錯誤; '[User_id] ,[Date_Posted] ,[Date_Modified] ,[Content] [0]來自[dbo]。[pos'at line 3 – Hannes 2014-09-25 22:15:11