質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1229閲覧

MySQLで指定カラムに最大値を持つレコードを取得

ikatako

総合スコア270

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/11/03 16:48

###実現したいこと
thread_ID = 11であるコードのうち、order_numberが最大のレコードを取得したいのですが、適切なSQLを教えていただけませんでしょうか。

###テーブル構成

CREATE TABLE p_comments (`ID` int, `thread_ID` int, `order_number` int) ; INSERT INTO p_comments (`ID`, `thread_ID`, `order_number`) VALUES (100, 11, 1), (101, 12, 1), (102, 13, 1), (103, 11, 2), (104, 13, 2), (105, 12, 2), (106, 11, 3), (107, 13, 3), (108, 11, 4) ;

###求める結果
thread_ID = 11であるレコードのうち、order_numberが最大のレコードはつまりID = 108のレコードなので以下の結果がほしいです。

尚、最大値は1つしかありません。

IDthread_IDorder_number
108114

書いてみたSQL

まずWHERE = 11と指定し、それらの最大という意図でMAX(order_number)と試したのですが、MAXの使い方が不適切なようでした。

SELECT ID, MAX(order_number) AS max_order_number FROM p_comments WHERE thread_ID = 11

MAXがよくわからないため、NOT EXISTSを以下のように使ってみたのですがこれでも実現できませんでした。

SELECT * FROM p_comments AS comments1 WHERE thread_ID = 11 AND NOT EXISTS ( SELECT 1 FROM p_comments AS comments2 AND comments1.order_number < comments2.order_number );

初歩的な質問で恐縮ですが、ご回答宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SQL

1SELECT `ID`,`thread_ID`,`order_number` FROM `p_comments` WHERE `order_number`=(SELECT MAX(`order_number`) FROM `p_comments`); 2

もしくは

PHP

1SELECT `ID`,`thread_ID`,`order_number` FROM `p_comments` ORDER BY `order_number` DESC LIMIT 1;

MAXがよくわからないため

MySQL Maxで検索すると最初に公式リファレンス
3.6.2 特定のカラムの最大値が格納されている行
が出てくるので、公式リファレンスのサンプルを実行しながら挙動を理解されることをおすすめします。
(MySQLに限らず、公式リファレンスから情報を得ることは開発や調査においてとても重要です)

投稿2020/11/03 17:16

編集2020/11/03 17:31
tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikatako

2020/11/03 17:30

もしくはの方はできませんでしたが、最初の方で実現できました。order_numberでサブクエリを書くのですね。勉強になりました。どうもありがとうございます。たしかにリファレンスにまんま載っていましたね…すみません。
tanat

2020/11/03 17:32

ORDER BYの方はDESCが抜けていましたね。(修正しました) こちらもリファレンスにあるサンプルほぼそのままなので試してみてください。
ikatako

2020/11/03 17:33

1つご質問よろしいでしょうか。 目的は、特定スレッドへのコメントについて、最大のorder_numberが欲しい。というものでした。 つまりthread_ID=11を指定して4だけが欲しかったわけでIDが不要でしたので、その場合サブクエリを発行せず以下だといかがでしょうか? ``` SELECT MAX(order_number) AS max_order_number FROM p_comments WHERE thread_ID = 11 ORDER BY order_number LIMIT 1 ```
ikatako

2020/11/03 17:36

ご修正ありがとうございます。なるほど、ORDER BY に DESC を指定すれば最大が得られますね。MAXとか複雑に考えすぎていいました。 そちらの方法で進めさせて頂こうと思います。助かりました。
tanat

2020/11/03 17:44

MAXを使うなら、ORDERは必要ないので SELECT MAX(order_number) AS max_order_number FROM p_comments WHERE thread_ID = 11 だけでいいですね。 どちらの場合でも、現状のテーブル構造だとインデックスが効かないので少しレコード数が多くなってくると重くなるで注意が必要です。 その辺りは別途DB設計とインデックス、実行計画について調べてみると良いかと思います
ikatako

2020/11/03 17:46

ちょうどインデックス勉強中でした。アドバイスありがとうございます。EXPLAINなども試して良い結果が出せるよう頑張ります。
guest

0

select max()で指定するカラムは、group by でも指定する必要があります。
group by order_number も追加してみてください。

もしくは、

尚、最大値は1つしかありません。

select対象のレコードが1行だけ、の認識でよければ、
「order by」+「limit 1」でもいけると思います。

投稿2020/11/03 17:12

wwwww

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikatako

2020/11/03 17:21 編集

このコメントは編集中です
wwwww

2020/11/03 17:24

select max ~ group by には、limitは必要ないです。 どちらでも可と思います!
ikatako

2020/11/03 17:26

失礼いたしました。上のコメントは間違いがございました。改めて以下のように返信させて頂きます。
ikatako

2020/11/03 17:27

> group by order_number も追加してみてください。 こちらですと4つのレコードが取得されてしまいました↓ ``` SELECT ID, MAX(order_number) AS max_order_number FROM p_comments WHERE thread_ID = 11 GROUP BY order_number ``` >「order by」+「limit 1」でもいけると思います。 order_number は4が取得できましたが、IDが108になりませんでした↓ (でもよく考えたらorder_numberだけあればいいのでこの方法でも良いかもです) ``` SELECT ID, MAX(order_number) AS max_order_number FROM p_comments WHERE thread_ID = 11 ORDER BY order_number LIMIT 1 ```
wwwww

2020/11/03 17:30 編集

>こちらですと4つのレコードが取得されてしまいました↓ 失礼しました…。 max値を入れ子にした書き方(…tanatさんの記載のSQLの1つめのような思想) をしないと1行にはならないですね。
ikatako

2020/11/03 17:37

いえどうぞお気になさらず。むしろいろいろ試せて勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問