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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1085閲覧

MYSQL それぞれのカラムのそれぞれの最大値を持つレコードの取得

pegy

総合スコア245

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/02 05:50

編集2021/08/02 06:21

例えば以下のような3カラムでcol_1col_2それぞれの最大値であるmemberがAであるレコードを取得したいと考えております。

col_1col_2member
22A
11B
21C
12D
13E

php

1$sql = "SELECT * FROM test_table WHERE col_1 = (SELECT MAX(col_1) FROM test_table) AND col_2 = (SELECT MAX(ver_minor) FROM test_table)" 2//Warning: PDO::prepare(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '

の様に条件句をANDで2つつなげることができず、構文エラーが発生してしまいます。「複数カラム それぞれ 最大値」の様に検索すると、複数カラムの中での最大値で3をもつEの様なパターンはすぐ出てくるのですが、今回の様にそれぞれの最大値という場合にはどの様にすれば良いのでしょうか?
直感的にどちらかのカラムが優先して先に問い合わせしなくてはいけないのはわかっているのですが、今回の場合
優先はcol_1でございます。

よろしくお願い申し上げます。

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

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

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

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

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

m.ts10806

2021/08/02 06:02

同値の場合はどうするのでしょうか
yambejp

2021/08/02 06:05

col_2の最大値は3でEです
pegy

2021/08/02 06:10

m.ts10806様 コメントありがとうございます。複数のレコードを取得すると考えております。 よろしくお願い申し上げます。
pegy

2021/08/02 06:13

yambejp様 はい、ご理解のとおりです。「col_2の最大値は3でE」なのですが、問い合わせ内容と何か矛盾ございますでしょうか?今一度、自身の質問内容を読み直してみたのですが、わからず申し訳ございません。
yambejp

2021/08/02 06:14

つまり、今回のデータには該当がなしということですか?
pegy

2021/08/02 06:15

col_1とcol_2の中で最大値でる3のレコードを取得したいわけではなく、col_1の最大値2の中でcol_2の最大値2であるmemberカラムAであるレコードを取得したいという意図でございます。不十分、不明瞭な点があればご指摘ください。よろしくお願い申し上げます。
yambejp

2021/08/02 06:16

>col_1の最大値2の中でcol_2の最大値2である 失礼しました。命題を読み違えておりました。
pegy

2021/08/02 06:20

いえ、こちらも記述がわかりづらい部分があり、お詫び申し上げます。
pegy

2021/08/02 06:20

sazi様 ご指摘があった括弧の括りのコードミスを本文で修正しております。 大変失礼しました。
guest

回答1

0

ベストアンサー

SQLを整形してみると、以下の様に()が正しく閉じられていないのが分かります。

SQL

1SELECT * FROM test_table 2WHERE col_1 = ( 3 SELECT MAX(col_1) FROM test_table 4 AND col_2 = ( 5 SELECT MAX(ver_minor) FROM test_table

エラーは取り敢えず置いておいて、やりたい事は以下の様な事だと思います。

SQL

1SELECT * FROM test_table t1 2WHERE col_1 = (SELECT MAX(col_1) FROM test_table) 3 AND col_2 = (SELECT MAX(col_2) FROM test_table where col_1=t1.col_1)

※他の記述パターンもあります。

「複数カラム それぞれ 最大値」の様に検索すると、複数カラムの中での最大値で3をもつEの様なパターンはすぐ出てくる

参考になるものはありましたよ。
応用出来るようになって下さいね。

投稿2021/08/02 06:06

編集2021/08/02 06:26
sazi

総合スコア25327

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

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

pegy

2021/08/02 06:41

ありがとうございます。実装はできたのですが、抽象的かもしれませんが、順序的な考え方を念のために確認させてください。 1. "t1 WHERE col_1 = (SELECT MAX(col_1) FROM test_table) " → col_1が最大値のテーブルを作成してエイリアスとしてt1と名付けている 2. "AND col_2 = (SELECT MAX(col_2) FROM test_table where col_1=t1.col_1)" →上記で得られたテーブルをwhere col_1=t1.col_1句で絞った上でcol_2の最大値の条件を設定している という流れなのでしょうか?俯瞰してみるとWHERE A AND Bの様に並列の条件でAとBで依存関係がない様に見えるのですが、これもサブクエリの一つの書き方として先行する句の結果を後で続く句で利用できるということなのでしょうか?
pegy

2021/08/02 06:43

ご指摘のあった、参考になりそうなサイトについて、今GROUP BYを使ったやり方を試しております。すぐに実装できてこれでもできました!と返信しようと思ったのですがSQL文の取り扱いに不慣れで、できたらまたコメントができればと考えております。一旦ご指摘ありがとうございます。
sazi

2021/08/02 07:14

col_2の問い合わせは、「相関副問合せ」と言われるもので、イメージ的にはfrom句の表の1行毎に問合せされるものです。 なので、以下の認識で相違ありません。 > where col_1=t1.col_1句で絞った上でcol_2の最大値の条件を設定している
pegy

2021/08/02 07:46

コメントありがとうございます。お恥ずかしながら、「相関副問合せ」という言葉を初めて知りました。類似の案件と含めて調べてみようと思います。おそらく自分の能力で考えるとサンプルコードを書きながらじっくり理解する必要があり数日はかかるため、案件自体は一旦Closeさせていただきます。 お力添えに感謝をいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問