MySQL: Ordering Results Before Group By
When grouping results in MySQL, it's important to understand the order of operations. By default, MySQL will order the results after they have been grouped, which may not be the desired behavior in certain cases.
Original Query and Limitation
Consider the following query:
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 query correctly groups the results to show only the latest post for each author. However, the results are ordered after the grouping, so the latest post may not necessarily be at the beginning of the list.
Solution Using HAVING
To order the results before grouping, we can use the HAVING clause:
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) ORDER BY wp_posts.post_date DESC
The HAVING clause filters the results after the grouping, ensuring that only the rows with the maximum post_date for each author are returned. This guarantees that the latest post is shown at the beginning of the list.
Alternative Solution for Other Databases
If using a database that does not support the HAVING clause (such as Postgres or SQL Server), an alternative solution is to join the original table with a subquery that computes the maximum post_date for each author:
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
The above is the detailed content of How to Order MySQL Results Before Grouping?. For more information, please follow other related articles on the PHP Chinese website!