2017-03-05 3 views
0

詳細を説明するために、私は現在、ユーザーにアカウントとログインを作成させるアプリケーションをビルドしています。彼らが提供した彼らの情報は私のデータベースに保存されます。私のデータベースには、ユーザー情報を保持するテーブルが1つしかありません。各行は1人のユーザーです。ここではあなたのより良いアイデアを与えるための画像です:カラムがゼロであればそれを更新するかどうかをチェックし、そうでなければ次のカラムに移動するSQLクエリを書くにはどうしたらいいですか?

Image of my database

最初の6列は、ユーザーの情報で構成されています。しかし、私のアプリでは、ユーザーは40個のスロットで構成されるインベントリを持っています。つまり、データベースの余分な列が何であるかです。スロット列の1つのノードがゼロに等しい場合、これはインベントリスロットが空であることを意味します。しかし、それが0以外の任意の数であれば、そのスロットに特定のアイテムがあることを意味します。

これで、ユーザーがボタンをクリックすると、現在の名前のi変数をアイテムのIDである特定の番号に設定するランダムメソッドが呼び出されます。この時点で、ユーザはアイテムを保持するかどうかを尋ねる2つのボタンが表示されます。彼らがアイテムを保持することを決めたら、それをデータベースのインベントリに追加する必要があります。これは私の質問が出てくる場所です。私のアプリは、誰かがログインしたときにログインしているユーザを知っています。なぜなら、他の人が利用できる文字列変数にプライマリキーであるユーザ名を設定するからです。更新する行はわかっていますが、順番に各列をチェックする必要があります。ノード内にゼロがある列が見つかると、変数 "i"の現在の値に更新されます。

これは私の現在のコードである、(それはとても悪いので)これはあなたを傷つける場合、私は謝罪、私はSQLに非常に新しいですが、私は自分自身を教えしようとしている:

try{ 
     //get connection to database 
     Connection con = DataBaseConnect.getConnection(); 
     //create a statement 
     PreparedStatement updateInv = con.prepareStatement("UPDATE userinfo " 
       + "SET InvSlot1 = CASE WHEN InvSlot1 = 0 THEN SET InvSlot1 = "+i+" ELSE InvSlot1 END " 
       + "InvSlot2 = CASE WHEN InvSlot2 = 0 THEN SET InvSlot2 = "+i+" ELSE InvSlot2 END " 
       + "InvSlot3 = CASE WHEN InvSlot3 = 0 THEN SET InvSlot3 = "+i+" ELSE InvSlot3 END " 
       + "InvSlot4 = CASE WHEN InvSlot4 = 0 THEN SET InvSlot4 = "+i+" ELSE InvSlot4 END " 
       + "InvSlot5 = CASE WHEN InvSlot5 = 0 THEN SET InvSlot5 = "+i+" ELSE InvSlot5 END " 
       + "InvSlot6 = CASE WHEN InvSlot6 = 0 THEN SET InvSlot6 = "+i+" ELSE InvSlot6 END " 
       + "InvSlot7 = CASE WHEN InvSlot7 = 0 THEN SET InvSlot7 = "+i+" ELSE InvSlot7 END " 
       + "InvSlot8 = CASE WHEN InvSlot8 = 0 THEN SET InvSlot8 = "+i+" ELSE InvSlot8 END " 
       + "InvSlot9 = CASE WHEN InvSlot9 = 0 THEN SET InvSlot9 = "+i+" ELSE InvSlot9 END " 
       + "InvSlot10 = CASE WHEN InvSlot10 = 0 THEN SET InvSlot10 = "+i+" ELSE InvSlot10 END " 
       + "InvSlot11 = CASE WHEN InvSlot11 = 0 THEN SET InvSlot11 = "+i+" ELSE InvSlot11 END " 
       + "InvSlot12 = CASE WHEN InvSlot12 = 0 THEN SET InvSlot12 = "+i+" ELSE InvSlot12 END " 
       + "InvSlot13 = CASE WHEN InvSlot13 = 0 THEN SET InvSlot13 = "+i+" ELSE InvSlot13 END " 
       + "InvSlot14 = CASE WHEN InvSlot14 = 0 THEN SET InvSlot14 = "+i+" ELSE InvSlot14 END " 
       + "InvSlot15 = CASE WHEN InvSlot15 = 0 THEN SET InvSlot15 = "+i+" ELSE InvSlot15 END " 
       + "InvSlot16 = CASE WHEN InvSlot16 = 0 THEN SET InvSlot16 = "+i+" ELSE InvSlot16 END " 
       + "InvSlot17 = CASE WHEN InvSlot17 = 0 THEN SET InvSlot17 = "+i+" ELSE InvSlot17 END " 
       + "InvSlot18 = CASE WHEN InvSlot18 = 0 THEN SET InvSlot18 = "+i+" ELSE InvSlot18 END " 
       + "InvSlot19 = CASE WHEN InvSlot19 = 0 THEN SET InvSlot19 = "+i+" ELSE InvSlot19 END " 
       + "InvSlot20 = CASE WHEN InvSlot20 = 0 THEN SET InvSlot20 = "+i+" ELSE InvSlot20 END " 
       + "InvSlot21 = CASE WHEN InvSlot21 = 0 THEN SET InvSlot21 = "+i+" ELSE InvSlot21 END " 
       + "InvSlot22 = CASE WHEN InvSlot22 = 0 THEN SET InvSlot22 = "+i+" ELSE InvSlot22 END " 
       + "InvSlot23 = CASE WHEN InvSlot23 = 0 THEN SET InvSlot23 = "+i+" ELSE InvSlot23 END " 
       + "InvSlot24 = CASE WHEN InvSlot24 = 0 THEN SET InvSlot24 = "+i+" ELSE InvSlot24 END " 
       + "InvSlot25 = CASE WHEN InvSlot25 = 0 THEN SET InvSlot25 = "+i+" ELSE InvSlot25 END " 
       + "InvSlot26 = CASE WHEN InvSlot26 = 0 THEN SET InvSlot26 = "+i+" ELSE InvSlot26 END " 
       + "InvSlot27 = CASE WHEN InvSlot27 = 0 THEN SET InvSlot27 = "+i+" ELSE InvSlot27 END " 
       + "InvSlot28 = CASE WHEN InvSlot28 = 0 THEN SET InvSlot28 = "+i+" ELSE InvSlot28 END " 
       + "InvSlot29 = CASE WHEN InvSlot29 = 0 THEN SET InvSlot29 = "+i+" ELSE InvSlot29 END " 
       + "InvSlot30 = CASE WHEN InvSlot30 = 0 THEN SET InvSlot30 = "+i+" ELSE InvSlot30 END " 
       + "InvSlot31 = CASE WHEN InvSlot31 = 0 THEN SET InvSlot31 = "+i+" ELSE InvSlot31 END " 
       + "InvSlot32 = CASE WHEN InvSlot32 = 0 THEN SET InvSlot32 = "+i+" ELSE InvSlot31 END " 
       + "InvSlot33 = CASE WHEN InvSlot33 = 0 THEN SET InvSlot33 = "+i+" ELSE InvSlot33 END " 
       + "InvSlot34 = CASE WHEN InvSlot34 = 0 THEN SET InvSlot34 = "+i+" ELSE InvSlot34 END " 
       + "InvSlot35 = CASE WHEN InvSlot35 = 0 THEN SET InvSlot35 = "+i+" ELSE InvSlot35 END " 
       + "InvSlot36 = CASE WHEN InvSlot36 = 0 THEN SET InvSlot36 = "+i+" ELSE InvSlot36 END " 
       + "InvSlot37 = CASE WHEN InvSlot37 = 0 THEN SET InvSlot37 = "+i+" ELSE InvSlot37 END " 
       + "InvSlot38 = CASE WHEN InvSlot38 = 0 THEN SET InvSlot38 = "+i+" ELSE InvSlot38 END " 
       + "InvSlot39 = CASE WHEN InvSlot39 = 0 THEN SET InvSlot39 = "+i+" ELSE InvSlot39 END " 
       + "InvSlot40 = CASE WHEN InvSlot40 = 0 THEN SET InvSlot40 = "+i+" ELSE InvSlot40 END " 
       + "WHERE userinfo.Username = '"+LoginController.userLog+"'"); 
     //process result set 
     updateInv.executeUpdate(); 
     } 
    catch(Exception e){ 
     e.printStackTrace(); 
     } 
} 

私が知っています実際には仕事が必要ですが、私は自分の問題を説明するために最善を尽くしています。誰にもアイデアはありますか?

P.S.私はまた、この質問のフォーマットが適切でないか適切でない場合には謝罪します。私の質問を改善するためのヒントやトリックを教えてください。私ができる限り長く頑張りたい!

+4

「スロット」と呼ばれる40個の列は、優れたデータモデルのようではありません。これはおそらく 'UserSlots'と呼ばれる別のテーブルでなければなりません(" 40 "が普遍定数でない限り)。 –

+0

ユーザーあたり40スロットの上限がありますが、これ以上は得られません。別のテーブルを作成しようと考えていましたが、これで簡単になると結論づけました(再び、SQLだから私の判断は最高ではありません、助言が役に立ちます) – CRSoftware33

+0

あなたは本当に 'UserSlots'と呼ばれる別のテーブルを作るべきです。 –

答えて

0
update users 
    set InvSlot1 = CASE WHEN InvSlot1 = 0 THEN _something_ ELSE InvSlot1 END, 
     InvSlot2 = CASE WHEN InvSlot2 = 0 THEN _something else_ ELSE InvSlot2 END, 
     ..... the rest of InvSlots .... 
    WHERE ... your condition what users to update ... 
+0

だから、私はデータベースのユーザーのユーザー名と同じ変数を持っていますが、 "WHERE"の後にその変数を入れて、データベースにどの行をするかを教えてもらえますか? – CRSoftware33

+0

確かに進んでください:-) e、g、 '......... WHERE user.username ='。$ username –

+0

私は現在、現在Javaアプリケーションでこれをやっています。準備されたステートメントに設定されたコードはすべて正しいですか? – CRSoftware33

関連する問題