2016-11-03 6 views
0

は私のMySQLのテーブルです: -Javaコードを避けるために、4つの異なるMySQLクエリをif条件と一緒にマージすることは可能ですか?ここ

以下
pk_id priority active total 
-------------------------------- 
1  west  0  3 
2  north  0  0 
3  south  1  1 
4  east  0  0 

は、MySQL帖と私のJavaのコードです: -

String past_p; 
String past_tot; 
String new_p; 
String new_tot; 


//query 1: active= 1 means, past processed data. 

String past_priority = "select priority, total from tbl_priority where active = 1"; 

     Statement stmt = (Statement) conn.createStatement(); 
     ResultSet Op=stmt.executeQuery(past_priority); 
     if(Op.next()){   
      past_p =Op.getString("priority"); 
      past_tot =Op.getString("total "); 
      } 
//query 2: 

String new_priority = "Select priority, max(total) from tbl_priority"; 

     ResultSet Np =stmt.executeQuery(new_priority); 
     if(Np.next()){ 

      new_p =Np.getString("priority"); 
      new_tot =Np.getString("total "); 
      } 

     if (past_tot >= new_tot){ 

      return 0; 
     } 

     else{ 

    //query 3: 

     String update_a= "update tbl_priority set active=0 where NOT (priority=?"); 


    PreparedStatement upa = conn.prepareStatement(update_a); 
    upa.setString(1, new_p); 
    upa.executeUpdate(); 

    // query 4: 

     String update_b= "update tbl_priority set active = 1 where priority =?"; 

    PreparedStatement upb = conn.prepareStatement(update_b); 
    upb.setString(1, new_p); 
    upb.executeUpdate(); 
} 

私は時間が本当に重要アプリケーションを保存し、リアルタイムの生活を開発しています。 私はこの関数を小さな間隔で呼び出す必要があるので、処理能力と実行時間を節約するために上記のコードを最適化する必要があります。

上記機能の簡単な説明:

クエリ1:

Iがアクティブフラグとそれぞれの優先度の合計値を識別するために必要、1 =アクティブ、

クエリ2/3/4:

最高の合計値が必要です。前回の処理データと比較する必要があります。以前の値より大きい場合は、以前に処理したデータのフラグをリセットし、現在の最高合計値でアクティブ= 1を設定する必要があります。

上記の例では、現在の最高(最大(合計))は「西」で、過去のアクティブは南です。南西の活発な旗は現在の西が合計で最高の価値を持つことを確認した後に変更する必要があります。

これらのMySQLクエリがマージされると、処理速度と実行時間が節約されます。

これらのMySQLのquiresをマージし、同じ結果(多分ジョイント機能を使用して)を得るために中間のJavaコードを避けることは可能ですか?私は数回試して失敗しました。

コードの一部が高く評価されています!

ありがとうございました。

+0

こんにちは、私はちょうど上記のプロセスを最適化する必要があります。私はsqlクエリを使用して解決策ですが、私は入れ子quiresとSQL結合しようとしましたが失敗しました!どんな助けも高く評価されます。 – jasim

+1

さて、あなたはそれを行うストアドプロシージャを作成しないでください....そして、コードの背後と変数の内部であなたの検証を避けることができますか?小規模な手順を実行するには秒の半分の時間がかかりますが、そのすべてのチェックとifをスキップしてそこに進んでいきます。手順の最後には現在の優先順位を選択してください。 – Veljko89

+0

@ Veljko89応答に感謝します。現在の優先順位の選択は、プログラム全体ではなく、この機能の終了です。ストアドプロシージャについてはあまりよく分かりません。提案はありますか? – jasim

答えて

1

アクティブなアイテムが1つしかない場合は、合計値の最大値を探して、検索と比較を行わずにステータスをリセットするだけです。

SET @pk_id_tmp = (SELECT `pk_id` FROM `tbl_priority` ORDER BY `total` DESC, `active` DESC LIMIT 1); 

UPDATE `tbl_priority` 
SET `active` = CASE `pk_id` WHEN @pk_id_tmp THEN 1 ELSE 0 END 
+0

答えをありがとう。それを正しくテストしましょう。 – jasim

+0

うわー、それはうまくいった。あなたのために帽子。あなたはちょうど2行に20行のプログラムを入れました。もう1つの疑問があります。両方のqurieを1つにすることはできますか? – jasim

+1

1回の呼び出しで文全体を使用できます。 –

1

私は存在しない問題を解決しようとしていると感じていません。とにかく、ここに何か考えてみましょう...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(priority VARCHAR(12) NOT NULL PRIMARY KEY 
,total INT NOT NULL 
); 

INSERT INTO my_table VALUES 
('west',1), 
('north',0), 
('south',2), 
('east',0); 

SELECT * 
    , CASE FIND_IN_SET(total,(SELECT GROUP_CONCAT(DISTINCT total ORDER BY total DESC) x FROM my_table)) 
     WHEN 1 THEN 'active' 
     WHEN 2 THEN 'previous' END status 
    FROM my_table; 
+----------+-------+----------+ 
| priority | total | status | 
+----------+-------+----------+ 
| west  |  1 | previous | 
| north |  0 | NULL  | 
| south |  2 | active | 
| east  |  0 | NULL  | 
+----------+-------+----------+ 

UPDATE my_table SET total = 4 WHERE priority = 'west'; 

SELECT * 
    , CASE FIND_IN_SET(total,(SELECT GROUP_CONCAT(DISTINCT total ORDER BY total DESC) x FROM my_table)) 
     WHEN 1 THEN 'active' 
     WHEN 2 THEN 'previous' END status 
    FROM my_table; 
+----------+-------+----------+ 
| priority | total | status | 
+----------+-------+----------+ 
| west  |  4 | active | 
| north |  0 | NULL  | 
| south |  2 | previous | 
| east  |  0 | NULL  | 
+----------+-------+----------+ 
+0

あなたの努力と優しさに感謝します。私のプログラムの文脈を理解できなくてすみません。 – jasim

関連する問題