teratail header banner
teratail header banner
質問するログイン新規登録

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

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

新規登録して質問してみよう
ただいま回答率
85.30%
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回答

870閲覧

Mysqlのテーブル作成

xxx0_0xxx

総合スコア9

MySQL

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

SQL

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

0グッド

0クリップ

投稿2021/05/06 08:53

0

0

初心者です。
mysqlで、テーブルを作成しています。
定価から仕入れ価格を引いた差額を出すために、以下のコードを作成しました。
条件としては、
差額が最大であるデータを抽出します。

select i.name 商品名称 ,i.list_price 定価 ,pur.price 仕入価格 ,i.list_price-pur.price 差額 from purchases pur left join items i on pur.item_id=i.id where i.list_price-pur.price= (select max(i.list_price-pur.price) from purchases pur left join items i on pur.item_id=i.id);

御覧の通り、
同じleft joinを二度利用しています。
こういった二度手間がないように、すっきりとさせたいのですが、どこを変更したらよいかわかりません。
教えていただきたいです。よろしくお願いします。

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

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

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

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

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

K_3578

2021/05/06 08:57

left joinを複数回やるのがめんどいって話っすよね?
xxx0_0xxx

2021/05/06 09:00

より効率的なコードの書き方を求めています。 見栄えも悪いので何かいい方法はないかと探しています。
K_3578

2021/05/06 09:03

テーブル定義提示してくれると助かります。 とは言え、コード丸々差し上げるとただの作業になるんで、私は回答するにしても アドバイス程度に留めますが
m.ts10806

2021/05/06 09:06

問題は「作成(タイトル)」ではないと思うのですが、如何でしょうか。
m.ts10806

2021/05/06 09:07

いずれにしてもSELECTだけ提示されても何とも言えません。 必要なデータと現在のテーブル定義(複数テーブルがあるなら関連性が分かるER図もあればなおよし)を提示してください。
guest

回答1

0

ベストアンサー

今回のようなケースであればRANK()関数を使うことでサブクエリを減らすことができます。

sql

1SELECT * 2FROM ( 3 SELECT 4 I.name AS 商品名称, 5 I.list_price AS 定価, 6 P.price AS 仕入価格, 7 I.list_price - P.price AS 差額, 8 RANK() OVER (ORDER BY I.list_price - P.price DESC) AS rnk 9 FROM purchases P 10 JOIN items I ON P.item_id = I.id 11) T 12WHERE rnk = 1

投稿2021/05/07 10:45

neko_the_shadow

総合スコア2395

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

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

xxx0_0xxx

2021/05/10 11:28

実際にコード書いて実行してみた結果、すっきりした形になりました!! rank関数を使う発想が全くなかったので驚きです! 大変勉強になりました。 本当にありがとうございました(^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問