問題描述
我需要找到每個作者的最新帖子,然後分組結果,所以我只為每個作者一個最新的帖子。
SELECT wp_posts.* FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
ORDER BY wp_posts.post_date DESC
這是正確的分組輸出,所以我只得到一個作者的一個帖子,但它是排序結果後,他們已經被分組,而不是在他們被選定之前。
最佳解決方案
select wp_posts.* from wp_posts where wp_posts.post_status='publish'and wp_posts.post_type='post' group by wp_posts.post_author having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */ order by wp_posts.post_date desc
編輯:
經過一些評論,我決定新增一些額外的資訊。
我正在工作的公司也使用 Postgres,特別是 SQL Server 。此資料庫不允許這樣的查詢。所以我知道還有一種方法來做到這一點 (我在下面寫一個解決方案) 。如果您沒有按投影中所處理的所有列進行分組,或者使用聚合函式,那麼您也必須知道自己該做什麼。否則讓它成為!
我選擇了上面的解決方案,因為這是一個具體的問題。湯姆想要在 wordpress 網站上獲得每個作者的最近的帖子。在我看來,如果作者每秒鐘做多個帖子,這個分析可以忽略不計。 WordPress 甚至應該禁止它的 spam-double-post 檢測。我從個人經驗中知道,透過 MySQL,這樣一個骯髒的組織,表現有很大的好處。但是,如果你知道你做什麼,那麼你可以做到!我在專業負責的應用程式中有這麼髒的組織。這裡我有一些 mio 行的表需要 5-15s 而不是 100 ++秒。
有些利弊可能是有用的:http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html
SELECT
wp_posts.*
FROM
wp_posts
JOIN
(
SELECT
g.post_author
MAX(g.post_date) AS post_date
FROM wp_posts as g
WHERE
g.post_status='publish'
AND g.post_type='post'
GROUP BY g.post_author
) as t
ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date
ORDER BY wp_posts.post_date
但是如果這樣一來,對於作者來說,這是一秒鐘以上的一個帖子,你將獲得超過一行而不是最後一行。
現在您可以再次旋轉車輪,並獲得最高 Id 的職位。即使在這裡,至少不能保證你真的得到最後一個。
次佳解決方案
不知道我是否理解您的要求是正確的,但是內部宣告獲取每個作者最新的 post_date 列表,並將其與 wp_posts 表連線以獲得完整的記錄。
SELECT *
FROM wp_posts wp
INNER JOIN (
SELECT post_author
, MAX(post_date) AS post_date
FROM wp_posts
WHERE post_status = 'publish'
AND post_type = 'post'
GROUP BY
post.author
) wpmax ON wpmax.post_author = wp.post_author
AND wpmax.post_date = wp.post_date
ORDER BY
wp.post_date DESC
第三種解決方案
我認為 @edze 的回應是錯的。
在 MySQL manual 中,您可以閱讀:
MySQL extends the use of GROUP BY so that the select list can refer to nonaggregated columns not named in the GROUP BY clause. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Sorting of the result set occurs after values have been chosen, and ORDER BY does not affect which values the server chooses.
兩個偉大的參考:
抱歉,由於我的聲譽,我無法評論 @edze 的回覆,所以我寫了一個新的答案。
第四種方案
在 ORDER BY 之後執行 GROUP BY,使用 GROUP BY 包裝查詢,如下所示:
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.author
第五種方案
如果您在 group-statement 之前或之後訂購無關緊要,因為訂單僅意味著 213 將轉到 123 或 321 而不是更多。 group by 每列只需要幾個條目,不僅是最新的。我認為你在這裡使用 subselects
SELECT wp_posts.* FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
AND wp_posts.post_date = (Select max(post_date) from wp_posts where author = ... )
第六種方案
你怎麼看待這件事??似乎為我工作
SELECT wp_posts.post_author, MAX(wp_posts.post_date), wp_posts.status, wp_posts.post_type
FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
它給我所有的作者最新的 post_date … 你確定一個問題嗎?我不
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。