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

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

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

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

Q&A

解決済

2回答

3219閲覧

MySQLのMAX()関数の使い方がわるいようですが?

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

0グッド

0クリップ

投稿2015/08/04 04:40

編集2015/08/04 04:43

MySQLをJAVAで使っています。

下記のように、MAX関数を使ったのですが、
抽出結果+1のnew_food_idが常に1です。

どこが悪いのでしょうか?

なお、foodテーブル内のfood_idは、1~400まで、すでに入った
状態なので、401と結果が出てほしいのですが。

Company_idとCustomor_idを関数のパラメータで、下記SQL文へ渡す。

String sql =
"SELECT MAX(food_id) as max_food_id FROM food" // 食料品テーブル

  • " WHERE"
  • " (company_id = " + Company_id + ")" // 会社ID
  • " AND (customor_id = " + Customor_id + ")" // 顧客ID
  • " LIMIT 1";

dbRes = dbStatement.executeQuery(sql);

int new_food_id = 0;
if (dbRes.first() == true) {
new_food_id = dbRes.getInt("max_food_id") + 1;
}

常に、new_food_idが1になりますが、何が悪いのでしょうか?

※food_idは、primarykeyのidとは、別のIDです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

MAX関数使わなくても下記で何とかなるような。。。

SQL

1select food_id from food 2 where company_id = (会社ID) 3 and customer_id = (顧客ID) 4 order by food_id desc 5 limit 1;

投稿2015/08/04 10:22

yu-ri

総合スコア634

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

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

退会済みユーザー

退会済みユーザー

2015/08/04 13:01

ご回答ありがとうございます。 不思議な現象です。 MAXの方が、早いと思い、MAXだったのですが、どのみち、全件チェックするので、 上記、教えていただいた方法でも時間は、一緒ですね。 で、やってみたんですが、 下記のように、food_idが0が返ってきて、+1されるので、 下記のように、1の行が増産されただけでした。 レコードを見直しても、項目に間違いはないし、 ソースも単純ですし... =========================== company_id customer_id food_id 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 : =========================== とは、言っても、ありえないことなので、 MAXの方もあり得ない現象でした。 ソースのあちこちに、println()を仕込んで調査します。
yu-ri

2015/08/04 13:19 編集

ふーむ、となるとそもそもJAVAの構文が間違っているのかもしれませんが… dbRes.getInt()が常に0になっているのでしょうね。 (JAVAに関してはかじった程度なのでこれ以上は分かりません…!) 追記: 色々調べてみました。 if (dbRes.first() == true) ↓ if (dbRes.next()) にしたらどのような値が返ってきますでしょうか。
退会済みユーザー

退会済みユーザー

2015/08/04 13:41

わかりました。なおりました。 MAXのほうも、ODER BYの両パターンでうごきました。 どちらが、良いコーディングなんでしょう。 ※ちなみに原因は、JAVAは、変数の頭に接頭語をつけないのが、昔からの習わしと先日、ここで、判明して、それに沿ったコーディングに変えたのですが、 メンバー変数と、関数に渡している引数と、必然的に、そっくりな名前になってしまっていたので、SQLへは、クラス内のメンバー変数を WHERE文のところへ、使っていました。=関数の引数は、使っていない。 今までは、関数の引数は、int iPara_compay_id と、明確にパラメーターとわかるつけ方をしていたのですが、JAVAの風習にそって、 ・クラスのメンバー変数:copmpanyId ←よく後継者がこれを見て、型を判断できるなと思います。iCompnyIDにしたほうが、一目でわかるのに。 ・関数の引数:pCompamyId。・・・pはパラメーターという意味で、接頭語っぽくなってますが... とにかく解決しました。 ありがとうございました。
yu-ri

2015/08/04 15:13

MioAsakura様には様々なポリシーがおありのようですので、良いコーディングというものについては何とも言えません。 ただ以前にも申し上げましたが、「誰が見ても動きが分かる」プログラムが望ましいと私は考えます。 今回のケースですと、おそらくどちらも処理速度はそれほど変わりないでしょうし、可読性も同じようなものですのでお好きな方を選べばよいかと思います。
退会済みユーザー

退会済みユーザー

2015/08/04 21:26

承知しました。まだ、初心者なので、ポリシーなんてないです。 みなさんが、こっちがいいよとか、いうほうがあれば、それに従うだけです。 始めたばかりなので、以前に、 ・Javaのコーディング規約 ・・・ Googoleの規約が一般的で、素晴らしい   ⇒私との違いは、私は、プレフィックスを使ってしまっていうという馬鹿者です。    あと、if文や、for文の直後にスペースを入れてなかったので、入れるようにしました。 ・Java Docの書き方。 ・・・ これも多数の大会社やサイトを見て、真似をして書き、 Eclipsで出力テストを50回くらいやって、エラーやワーニングがでずに、かつ、読みやすい記述方法をさがしただけです。
guest

0

このままですと、「company_idとcustomer_idが所定の条件を満たした中でfood_idの最大値」という意味になります。

全体で最大値が必要なだけでしたら、WHEREを外してください。

投稿2015/08/04 05:40

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2015/08/04 09:34 編集

ご回答ありがとうございます。 「「company_idとcustomer_idが所定の条件を満たした中でfood_idの最大値」という意味になります。」 はい、それで、正しいです。 レコードには、すでに下記のように、food_id=1のレコードが存在するので、 抽出結果+1で、2が得られるはずなのに、 抽出結果は、常に0で、+1しているので、結果が1になります。 =========================== company_id customer_id food_id 1 1 1 =========================== それで、その1が次の番号だと判断し、 この後の処理で、新規にレコードを作るので、 また、food_id=1のレコードができ、今は、下記の状態です。 =========================== company_id customer_id food_id 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ===========================
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問