MySQL の group by と order by を一緒に使用する方法

MySQL の group by と order by を一緒に使用する方法

テーブル:reward(報酬テーブル)があるとします。テーブル構造は次のようになります。

テーブルtest.rewardを作成します(
 id int(11) NOT NULL AUTO_INCREMENT、
 uid int(11) NOT NULL COMMENT 'ユーザーuid',
 お金 小数点(10, 2) NOT NULL COMMENT '報酬額',
 datatime datetime NOT NULL COMMENT 'time',
 主キー (id)
)
エンジン = INNODB
AUTO_INCREMENT = 1
文字セット utf8
utf8_general_ci を照合する
COMMENT = '報酬テーブル';

表のデータは次のとおりです。

ここで、各人が受け取った最高の報酬を照会し、それを最大から最小の順に並べ替える必要があります。

直接問い合わせる場合:

SELECT id, uid, money, datatime FROM reward GROUP BY uid ORDER BY money DESC;

以下の結果が得られます。

必要な結果が得られませんでした。これは、group by と order by を一緒に使用すると、最初に group by が使用され、グループ化後の最初のデータが取り出されるためです。したがって、その後の order by による並べ替えは、取り出された最初のデータに基づいて行われますが、最初のデータは必ずしもグループ内で最大のデータであるとは限りません。

方法1:

この場合、最初に並べ替え、次にグループ化し、サブクエリを使用できます。

選択
 取り除く、
 r.uid、
 r.お金、
 r.データタイム
から(選択
  id、
  uid、
  お金、
  データタイム
 報酬から
 金額順(降順)r
GROUP BY r.uid
ORDER BY r.money DESC;

方法2:

レコード全体を取得する必要がない場合は、max() min() を使用できます。

SELECT id, uid, money, datatime, MAX(money) FROM reward GROUP BY uid ORDER BY MAX(money) DESC;

結果は次のとおりです。

max() を使用して取得したレコードの money フィールドと max(money) フィールドに矛盾があることに気付いたかもしれません。これは、ここでは uid の最大値のみが取得され、最大値に対応するレコード全体が取得されないためです。

レコード全体を取得する必要がある場合は、このメソッドは使用できず、サブクエリを使用できます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL データベース グループ クエリの group by ステートメントの詳細な説明
  • MySQL の group by と having の詳細な説明
  • MySQL の効率的なクエリの左結合とグループ化 (プラス インデックス)
  • MySQL Group by最適化の詳細な説明
  • MySQLのGROUP BYステートメントを最適化する方法
  • 複数のフィールドをグループ化するMySQLグループ
  • 各グループの最新データを取得するためにMySQLベースのグループを実装する
  • MySQL の group by に関する簡単な説明

<<:  JavaScriptオブジェクト指向について学ぼう

>>:  Nginxドメイン名転送のhttpsアクセスの実装

推薦する

Google の新しい UI から学べること (画像とテキスト)

2011 年に最も顕著なウェブサイトの変更は、一連の製品に新しいユーザー インターフェースを導入した...

MySQL 8.0.15 圧縮版インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15圧縮版のインストール方法を紹介します。具体的な内容は...

見落とされがちなMETAタグの特殊効果(ページ遷移効果)

Web デザインで js を使用すると、多くのページ効果を実現できますが、HTML タグの META...

MySQLインデックスに関する詳細を共有する

数日前、同僚からMySQLのインデックスについて質問を受けました。大体わかっているのですが、まだ練習...

Vueプラグインの実装で発生した問題の概要

目次シーン紹介プラグインの実装問題1: 重複したヘッダーコンポーネント質問2: 別の実装アイデア質問...

8桁の割引コードをランダムに生成し、MySQLデータベースに保存します。

現在、多くの企業が割引コードを通じてプロモーションを行っています。今では、8桁の割引コードを実装して...

HTML と CSS の基礎 (必読)

(1) HTML: ハイパーテキストマークアップ言語。主に「ヘッダー」と「ボディ」の2つの部分で構...

MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...

グリッドはページのレイアウトプランです

<br /> 英語原文: http://desktoppub.about.com/od/...

CSS3 で六角形の境界線を実装するサンプルコード

一番外側の boxF は 120 度回転し、2 番目の boxS は -60 度回転し、3 番目の ...

解決策 - BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 権限が不十分です

1) jdkファイルが保存されているフォルダパスを入力します私はここにいますusr/local/jd...

VueはPCカメラを呼び出して写真機能を実現します

この記事の例では、VueがPCカメラを呼び出して写真機能を実現する具体的なコードを参考までに共有して...

Alibaba Cloud Ubuntu 16.04でpptpdサービスを構築する方法

1. PPTP VPNを構築するには、ポート1723とGREプロトコルを開く必要があります。 1. ...

Centos8.2 クラウド サーバー環境に Tomcat8.5 をインストールするための詳細なチュートリアル

Tomcatをインストールする前に、まずJDK環境をインストールしてくださいLinux サーバー上で...

count(1)、count(*)、count(列名)の実行の違いの詳細な説明

実施効果: 1. count(1) と count(*)テーブル内のデータ量が多い場合、テーブルを分...