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

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

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

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

Q&A

解決済

3回答

1666閲覧

重量に対する送料をSELECTするクエリー文

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

0グッド

0クリップ

投稿2015/10/26 23:35

MySQLで重量に対する送料をテーブルからSELECTするクエリーを考えているのですが、なかなか思いつかないのでアドバイスを頂けたらと思い質問させて頂きました。

まず重量に対する送料のテーブルtb_souryouを作ります。

sql

1tb_souryou 2No, weight, souryou 31, 100, 200 42, 200, 240 53, 300, 280 64, 400, 320 75, 500, 360 86, 750, 440 97, 1000, 620 108, 1500, 940 119, 2000, 1260

tb_souryouのweightはg(グラム)、souryouは円を表しています。

荷物の重量は様々ですが、例えば

・荷物が50gだとしたらtb_souryouからweight = 100のsouryouつまり200円が送料となります。
・荷物が365gだとしたらtb_souryouからweight = 400のsouryouつまり320円が送料となります。
・荷物が1200gだとしたらtb_souryouからweight = 1500のsouryouつまり940円が送料となります。

条件は、
・荷物が1~100gならweight=100のsouryouを取得します。
・荷物が101~200gならweight=200のsouryouを取得します。
・…
・荷物が1501~2000gならweight=2000のsouryouを取得します。
・荷物が2001g以上の場合は結果を返しません(tb_souryouに記録されているweightは2000までなので)。

このように荷物の重量が様々な条件の場合のSELECT souryou FROM tb_souryouはどのようなクエリー文になるのでしょうか?

tb_souryouのweightの値が変更されたとしてもクエリー文を変更しなくても良いようなクエリー文をお願い致します(CASE WHEN weight > 1500 AND weight <= 2000 THEN 1260 みたいに決め打ちのクエリー文ではなく…という意味です)。

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

すでに解決済みではありますが、、

以下のようにORDER BY句とLIMIT句を使用すれば、サブクエリを使わずに求めることができます。

sql

1SELECT souryou FROM tb_souryou WHERE weight >= 重量 ORDER BY weight ASC LIMIT 1;

実行結果

sql

1mysql> SELECT souryou FROM tb_souryou WHERE weight >= 100 ORDER BY weight ASC LIMIT 1; 2+---------+ 3| souryou | 4+---------+ 5| 200 | 6+---------+ 71 row in set (0.00 sec) 8 9mysql> SELECT souryou FROM tb_souryou WHERE weight >= 101 ORDER BY weight ASC LIMIT 1; 10+---------+ 11| souryou | 12+---------+ 13| 240 | 14+---------+ 151 row in set (0.00 sec) 16 17mysql> SELECT souryou FROM tb_souryou WHERE weight >= 2000 ORDER BY weight ASC LIMIT 1; 18+---------+ 19| souryou | 20+---------+ 21| 1260 | 22+---------+ 231 row in set (0.00 sec) 24 25mysql> SELECT souryou FROM tb_souryou WHERE weight >= 2001 ORDER BY weight ASC LIMIT 1; 26Empty set (0.00 sec)

投稿2015/10/27 02:29

KiyoshiMotoki

総合スコア4791

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

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

退会済みユーザー

退会済みユーザー

2015/10/27 02:35

こちらのほうが良さそうですね・・・! MySQLのサブクエリはなるべく使わないほうがいいということをちらほらと聞いていますので・・・。 ありがとうございます、非常に参考になりました!
guest

0

ベストアンサー

まずはサブクエリで条件を満たす重量を求めて、それから重量をキーに値段を引き直す、というような形がいいのではないかと思います。

SQL

1SELECT souryou FROM tb_souryou WHERE weight = (SELECT MIN(weight) FROM tb_souryou WHERE weight >= 重量)

投稿2015/10/26 23:40

maisumakun

総合スコア145183

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

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

trick

2015/10/27 00:55

これしかないですね
退会済みユーザー

退会済みユーザー

2015/10/27 01:47

ありがとうございます! 意外と簡単なのですね…。うまくできました。
guest

0

一般的に重量が大きいほど送料も高くなると思いますので、単純に下記のようなSQLでもいいかと。

SELECT MIN(souryou) FROM tb_souryou WHERE weight >= 重量;

例外があるなら、前の回答のサブクエリを使う方法になると思いますが。

投稿2015/10/27 01:58

hatena19

総合スコア33699

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

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

退会済みユーザー

退会済みユーザー

2015/10/27 02:02

ありがとうございます! そうですね、送料が必ず高くなるというレコードの場合はそのほうが簡単ですね! 例外はないと思いますが、たしかにMINを重量で取得したほうが確実ではあると思うのでサブクエリで取得したいと思います。 アドバイスありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問