[解決済み] MySQL order by before group by
質問
似たような質問がたくさんありますが、どの質問にも適切に答えているとは思えません。
現在最も人気のあるものから続けます。 質問 ということで、彼らの例を使ってみましょう。
この例でのタスクは、データベース内の各著者の最新の投稿を取得することです。
このクエリの例では、常に最新の投稿が返されるとは限らないので、使い物にならない結果が返されます。
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
残念ながら、この回答は単純明快な間違いであり、多くの場合、元のクエリよりも安定した結果を得ることができません。
私の最良の解決策は、次のような形式のサブクエリを使用することです。
SELECT wp_posts.* FROM
(
SELECT *
FROM wp_posts
ORDER BY wp_posts.post_date DESC
) AS wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
では、私の質問は簡単なものです。 サブクエリに頼らずにグループ化する前に行を並べ替える方法はありますか?
編集 : この質問は別の質問からの続きで、私の状況とは若干仕様が異なります。その特定の投稿の一意な識別子であるwp_posts.idも存在すると仮定してよい(はず)です。
どのように解決するのですか?
を使用することで
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 with Demo .
このデータを正確に返すためにサブクエリを使用するという私のコメントを発展させるために。
MySQLは
GROUP BY
に含むすべてのカラムを
SELECT
のリストを作成します。 その結果、もしあなたが
GROUP BY
に属する他のカラムの値が、10個のカラムを返すという保証はない。
post_author
が返されます。 もしそのカラムが
GROUP BY
MySQLはどのような値を返すべきかを選択します。
サブクエリと集約関数を使用することで、毎回正しい著者と投稿が返されることが保証されます。
余談ですが、MySQL では
ORDER BY
をサブクエリに適用することができます。
GROUP BY
のすべてのカラムに適用されるわけではありません。
SELECT
この動作は、SQL Serverを含む他のデータベースでは認められていません。
関連
-
[解決済み] MySQLクエリ GROUP BY 日/月/年
-
[解決済み] エラー1022 - 書き込みできません; テーブルに重複したキーがあります。
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] LINQで複数の "order by "を使用する
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] LINQのGroup by
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] 複数の列でグループ化する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】autoカラムは1つしか存在できない
-
[解決済み】「docker container run」は最低1つの引数を必要とする
-
[解決済み] MySQLの グループ関数の無効な使用
-
[解決済み] 1030 ストレージエンジンからエラー28が発生しました
-
[解決済み] mysql 拡張は非推奨で、将来的に削除されます: 代わりに mysqli か PDO を使ってください [重複] 。
-
[解決済み] このMySQLエラー Incorrect column specifier for column COLUMN NAMEを回避するにはどうしたらよいですか?
-
[解決済み] MySQL Workbenchが「このサーバーバージョンでは、この位置は無効です」というエラーを報告する。
-
[解決済み] 1行目の列 'id' に不正な整数値 '' があります。
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] MySql でクエリ実行時に only_full_group_by に関連するエラーが発生する。