MySQLにおけるcount()、group by、order byの具体的な使い方の詳細な説明

黄舟
リリース: 2017-05-28 09:56:43
オリジナル
2705 人が閲覧しました

mysqlorder by sortquery、asc 昇順、desc 降順、group by groupingquery、having は group by 句でのみ使用でき、グループ内で動作します。句の直後に関数式を続けることができます。 group by 句を使用するクエリ ステートメントでは、aggregation 関数を使用する必要があります。

最近、IM を行っているときに、これら 3 つのキーワードが同時に使用されているという問題に遭遇しました。これは、サーバーからクライアントに返されるオフライン メッセージの詳細を照会するためのもので、最初の内容は、オフライン期間中にどの人またはグループがメッセージを送信したかをリストする必要があります。オフラインメッセージは特定の人またはグループから送信されており、3 番目は最新のものを取り出して表示します。明らかに、オフライン メッセージを送信した人またはグループをグループごとにグループ化し、count() でオフライン メッセージの数を取得し、時間順に並べ替えて最新のメッセージを並べ替えます。

select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc group by from_company_id, from_user_id;
ログイン後にコピー

その後、予想通り、group by と order by を一緒に取得するとエラーが報告されます。ネストされたサブクエリを使用できます。

select count(1) as cnt, msg_data from (select * from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc) as temp_table group by from_company_id, from_user_id;
ログイン後にコピー

並べ替えられた結果セットをグループ化し、数量を計算できます。ここにはもう 1 つの隠れた落とし穴がありますが、実際には count() によって並べ替えによる順序が無効になります。このステートメントによって取得された最後のレコード、その中の msg_data は実際には存在しません。ソートの結果、つまりデータベースの元の順序は、最初に挿入されたメッセージ、つまり最も古いメッセージになるはずです。この問題を回避するには、ネストされたサブクエリを最初にここでソートし、次に count() に使用して回避します。思わず逃げてしまいましたが、何度も文章を変えてテストした結果、幸いなことに気づきました。

以上がMySQLにおけるcount()、group by、order byの具体的な使い方の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート