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

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

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

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

SQL

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

Q&A

解決済

1回答

1214閲覧

sql グループごと?

curekaishine

総合スコア82

MySQL

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

SQL

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

0グッド

2クリップ

投稿2016/02/15 10:53

CREATE TABLE IF NOT EXISTS nedan (
id int(11) NOT NULL AUTO_INCREMENT,
seihin_id int(11) NOT NULL,
koujou_id int(11) NOT NULL,
price int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

↑のようなテーブルがあるときに
製品ごとの最安値、最高値のレコードのkojou_idも知りたいのですがどのようなクエリになるでしょうか
まずクエリとしては2個に分けたりしないといけないでしょうか?
すみませんがアドバイスなどよろしくお願いします

製品ごとの最安値、最高値は↓クエリでだすことができました。

SELECT id, seihin_id, MAX( price ) , MIN( price )
FROM nedan
GROUP BY seihin_id

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

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

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

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

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

guest

回答1

0

ベストアンサー

seihin_idの最安値に対するkoujou_idと
seihin_idの最高値に対するkoujou_idを別々に求め、
seihin_id同士で結合すれば1つのSQLで求めることができます。
もちろん別々に求めても構いません。

SQL

1SELECT max_v.seihin_id, 2 max_v.max_koujou_id, 3 max_v.max_price, 4 min_v.min_koujou_id, 5 min_v.min_price 6FROM 7( 8 #max_priceのkoujou_idを求める 9 SELECT seihin_id, 10 koujou_id as max_koujou_id, 11 price as max_price 12 FROM nedan 13 WHERE (seihin_id, price) IN ( 14 SELECT seihin_id, MAX( price ) as max_price 15 FROM nedan 16 GROUP BY seihin_id 17 ) 18) max_v, 19( 20 #min_priceのkoujou_idを求める 21 SELECT seihin_id, 22 koujou_id as min_koujou_id, 23 price as min_price 24 FROM nedan 25 WHERE (seihin_id, price) IN ( 26 SELECT seihin_id, MIN( price ) as min_price 27 FROM nedan 28 GROUP BY seihin_id 29 ) 30) min_v 31where max_v.seihin_id = min_v.seihin_id

出力結果
seihin_id max_koujou_id max_price min_koujou_id min_price
1 2 120 3 90
1 2 120 4 90
2 3 333 1 111

もし同一seihin_idで同一価格のkoujou_idが存在していると上記結果のように、
同じseihin_idが繰り返してしまいます。
もし同一seihin_idを1行に表示するのであればgroup_concat関数を使って、
koujou_idを横に展開することができます。以下サンプルです。

SQL

1SELECT max_v.seihin_id, 2 max_v.max_price, 3 group_concat(distinct max_v.max_koujou_id separator ',') as max_koujou_id, 4 min_v.min_price, 5 group_concat(distinct min_v.min_koujou_id separator ',') as min_koujou_id 6FROM 7( 8 #max_priceのkoujou_idを求める 9 SELECT seihin_id, 10 koujou_id as max_koujou_id, 11 price as max_price 12 FROM nedan 13 WHERE (seihin_id, price) IN ( 14 SELECT seihin_id, MAX( price ) as max_price 15 FROM nedan 16 GROUP BY seihin_id 17 ) 18) max_v, 19( 20 #min_priceのkoujou_idを求める 21 SELECT seihin_id, 22 koujou_id as min_koujou_id, 23 price as min_price 24 FROM nedan 25 WHERE (seihin_id, price) IN ( 26 SELECT seihin_id, MIN( price ) as min_price 27 FROM nedan 28 GROUP BY seihin_id 29 ) 30) min_v 31where max_v.seihin_id = min_v.seihin_id 32GROUP BY max_v.seihin_id, 33 max_v.max_price, 34 min_v.min_price

出力結果
seihin_id max_price max_koujou_id min_price min_koujou_id
1 120 2 90 3,4
2 333 3 111 1

投稿2016/02/15 12:41

nabe3

総合スコア345

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

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

curekaishine

2016/02/17 15:17

なるほどサブクエリというやつですね ローカルで動かすことができました!ありがとうございます 試してみる感じ一回でなく二個のクエリに分けたほうがいい感じですね もうちょっとにょろにょろやってみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問