ORDER BY
を使用する サブクエリでのこの問題の最善の解決策ではありません。
max(post_date)
を取得するための最良の解決策 作成者は、サブクエリを使用して最大日付を返し、それを両方のpost_author
のテーブルに結合します。 と最大日。
解決策は次のとおりです。
SELECT p1.*
FROM wp_posts p1
INNER JOIN
(
SELECT max(post_date) MaxPostDate, post_author
FROM wp_posts
WHERE post_status='publish'
AND post_type='post'
GROUP BY post_author
) p2
ON p1.post_author = p2.post_author
AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
AND p1.post_type='post'
order by p1.post_date desc
次のサンプルデータがある場合:
CREATE TABLE wp_posts
(`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;
INSERT INTO wp_posts
(`id`, `title`, `post_date`, `post_author`)
VALUES
(1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
(2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;
サブクエリは、次の最大日付と作成者を返します:
MaxPostDate | Author
2/1/2013 | Jim
次に、それをテーブルに結合しているので、両方の値で、その投稿の完全な詳細を返します。
SQL Fiddle withDemo を参照してください。 。
サブクエリを使用してこのデータを正確に返すことについての私のコメントを拡張します。
MySQLはGROUP BY
を強制しません SELECT
に含めるすべての列 リスト。その結果、GROUP BY
のみの場合 1列ですが、合計10列を返します。post_author
に属する他の列の値が保証されるわけではありません。 それが返されます。列がGROUP BY
にない場合 MySQLは返される値を選択します。
集計関数でサブクエリを使用すると、毎回正しい作成者と投稿が返されることが保証されます。
ちなみに、MySQLではORDER BY
を使用できます サブクエリで、GROUP BY
を適用できます SELECT
のすべての列ではありません この動作は、SQLServerを含む他のデータベースでは許可されていません。