ホームページ  >  記事  >  データベース  >  mysql で count()、group by、order by の使用方法を共有する

mysql で count()、group by、order by の使用方法を共有する

小云云
小云云オリジナル
2018-01-17 10:47:462372ブラウズ

この記事では、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;

ソートされた結果セットをグループ化し、数量を計算します。ここにはもう 1 つの隠れた落とし穴がありますが、実際には 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;

このステートメントによって取得された最後のレコード、その中の msg_data は、実際にはまったくソートされていない結果、つまりデータベースの元の順序です。それは古いニュースです。この問題を回避するには、ネストされたサブクエリを最初にここでソートし、次に count() に使用して回避します。思わず逃げてしまいましたが、幸い何度も文章を変えてテストした結果判明しました。 関連する推奨事項:

count() に関する推奨記事 10 件

🎜🎜 MySql で Group By を使用して複数のフィールドをグループ化する方法 🎜🎜🎜🎜 MySQL の Order By 複数フィールドの並べ替えルールの詳細な説明 🎜🎜

以上がmysql で count()、group by、order by の使用方法を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。