2016-07-19 22 views
1

私は既存のデータベース構造を持つウェブサイトを継承しました。私は、次の構造のようなものを持っている一つのテーブル(TABLE1)を持つ:テーブルのフィールド値を比較してデータベースに新しい値を挿入する

POSITION_1_TAGS_PERMITTED | POSITION_2_TAGS_PERMITTED | POSITION_3_TAGS_PERMITTED 
---------------------------------------------------------------------------------- 
CD       | EN,CS      | TECH,CS 

TABLE1は20列まで、この構造を有しています。

Iは、次いで、選択された値を格納する別のテーブル(TABLE2)(また、20列を有する)を有する:

POS1_SEL_SYMBOL | POS2_SEL_SYMBOL | POS3_SEL_SYMBOL | POS4_SEL_SYMBOL 
--------------------------------------------------------------------- 
A    | AAPL   |     | AA 

を私は変数のタグがCSあり、この場合に選択された変数のタグを有します。私はTABLE1に許可されたタグを持つ位置を見つけて、TABLE2を参照して、その位置にすでにエントリがあるかどうかを確認したいと思います。この場合、エントリを追加するカラムとしてポジション3が指定され、新しいエントリをデータベースに追加するための新しい更新文を作成します。私のデータベースの列形式でこれを行う簡単な方法はありますか?

EDIT:変数に複数のタグがある場合は、許可されているタグの列を検索することができます。 SQL文を次のように更新しようとしました。

SELECT eventid, 
CASE 
WHEN (FIND_IN_SET("S&P", POSITION_1_TAGS_PERMITTED) OR FIND_IN_SET("CS", POSITION_1_TAGS_PERMITTED)) AND POS1_SEL_SYMBOL = "" 
THEN 1 
END AS found_col 
FROM TABLE1 
JOIN TABLE2 
USING (eventid) 
WHERE EVENTID='159' 

このクエリでは、CSの検索と同じ結果は得られません。

+0

タグCSを使用して、ポジション2とポジション3の間の決定方法を教えてください。 – BeetleJuice

+0

@BeetleJuice TABLE2の最初の空の列を選択します。位置2が空白の場合は、そこに挿入します。この例では、位置2は既に満杯になっているため、位置3に移動する必要があります。 – user1048676

+0

2つのテーブルの行を関連付ける列はありますか? – Barmar

答えて

3
SELECT eventid, 
    CASE 
     WHEN FIND_IN_SET('CS', POSITION_1_TAGS_PERMITTED) AND POS1_SEL_SYMBOL = '' 
     THEN 1 
     WHEN FIND_IN_SET('CS', POSITION_2_TAGS_PERMITTED) AND POS2_SEL_SYMBOL = '' 
     THEN 2 
     WHEN FIND_IN_SET('CS', POSITION_3_TAGS_PERMITTED) AND POS3_SEL_SYMBOL = '' 
     THEN 3 
     ... 
     WHEN FIND_IN_SET('CS', POSITION_20_TAGS_PERMITTED) AND POS20_SEL_SYMBOL = '' 
     THEN 20 
    END AS found_col 
FROM TABLE1 
JOIN TABLE2 USING (eventid) 

は、あなただけの列番号を返すのではなく、見つかったフィールドを更新するように、あなたがこのような構造を使用して適応させることができUPDATEクエリのSQL Insert in first empty column in a row MySQL errorを参照してください。しかし、20列では、そのクエリは本当に長くなるでしょう。

+0

あなたはどのようにしてSQLについて学びましたか? 'FIND_IN_SET'ヒントをありがとう。脳のための新しい食べ物。 – BeetleJuice

+0

これは素晴らしいことです。タグを付けた場合、私が探していた複数のタグがあった場合はどうなりますか?この場合、「CS」は「CS、EN」であった。 POSITION_X_TAGS_PERMITTEDの両方を検索しますか? – user1048676

+0

'FIND_IN_SET'( 'CS'、POSITION_X_TAGS_PERMITTED)AND FIND_IN_SET( 'EN'、POSITION_X_TAGS_PERMITTED)'を2つの 'FIND_IN_SET'呼び出しを' AND'で結合する必要があります。 – Barmar

関連する問題