I need to find the latest post for each author and then group the results so I only a single latest post for each author.
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
This is correctly grouping the output so I only get one post per author, but it is ordering the results after they have been grouped and not before they have been selected.
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
EDIT:
After some comments I have decided to add some additional informations.
The company I am working at also uses Postgres and especially SQL Server. This databases don’t allow such queries. So I know that there is a other way to do this (I write a solution below). You shoud also have to know what you do if you don’t group by all columns treated in the projection or use aggregate functions. Otherwise let it be!
I chose the solution above, because it’s a specific question. Tom want to get the recent post for each author in a wordpress site. In my mind it is negligible for the analysis if a author do more than one post per second. WordPress should even forbid it by its spam-double-post detection. I know from personal experience that there is a really significant benefit in performance doing a such dirty group by with MySQL. But if you know what you do, then you can do it! I have such dirty groups in apps where I’m professionally accountable for. Here I have tables with some mio rows which need 5-15s instead of 100++ seconds.
May be useful about some pros and cons: http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html
But if here is more then one post per second for a author you will get more then one row and not the only last one.
Now you can spin the wheel again and get the post with the highest
Id
. Even here it is at least not guaranteed that you really get the last one.Not sure if I understand your requirement correct but following inner statement gets the list of the latest post_date for each author and joins these back with the wp_posts table to get a complete record.
I think that @edze response is wrong.
In the MySQL manual you can read:
Two great references:
Sorry, but I can not comment the @edze response because of my reputation, so I have written a new answer.
Do a GROUP BY after the ORDER BY by wrapping your query with the GROUP BY like this:
it doesn’t matter if you order before or after the group-statement, because order means only that 213 goes to 123 or 321 and not more. group by takes only SOME entry per column, not only the latest. I consider you working with subselects here like
What do you think about this?? Seems to work for me
It brings me all the Authors with the most updated post_date … Do you identify a problem there?? I don’t
When our table became large, performance need to checked also.
I checked all the options in the questions here, with a PM system with a 136K messages and link table with 83K rows.
When you need only count, or only IDs – Alex’s solution is the best.
When you need other fields, I need to modify Husky110 solution (to my table design – here it is only example – not checked), that in my tables 10x faster than the subquery option:
This change can select more than one post (one for user, for example), and can be modified to other solutions.
Moshe.
Use the below code…
HERE a simple answer from
http://www.cafewebmaster.com/mysql-order-sort-group
it worked wonders for me