この記事では、mysql で count()、group by、order by を使用する方法を主に説明します。mysql の order by は、ソートクエリ、asc 昇順、desc 降順のグループクエリであり、グループ内でのみ使用できます。 by 句と act on グループ内では、having 条件句の直後に関数式を続けることができます。 group by 句を使用したクエリ ステートメントでは、集計関数を使用する必要があります。
最近、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;
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;<br>
我们可以对已经排序的结果集,再来分组并计算数量。这里还有一个暗坑,我自己不小心给躲过去了,其实count()会造成order by排序无效,举个例子:
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 と 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;
このステートメントによって取得された最後のレコード、その中の msg_data は、実際にはまったくソートされていない結果、つまりデータベースの元の順序です。それは古いニュースです。この問題を回避するには、ネストされたサブクエリを最初にここでソートし、次に count() に使用して回避します。思わず逃げてしまいましたが、幸い何度も文章を変えてテストした結果判明しました。 関連する推奨事項:
🎜🎜 MySql で Group By を使用して複数のフィールドをグループ化する方法 🎜🎜🎜🎜 MySQL の Order By 複数フィールドの並べ替えルールの詳細な説明 🎜🎜以上がmysql で count()、group by、order by の使用方法を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。