2011-07-28 12 views
0

まず、スキーマは私のものではありません。それは恐ろしいと非常に混乱しています。そして警告 - これは複雑です。WHEREの結果に基づくINSERT INTO JOIN

私は3つのテーブル - tbl_a,tbl_b、およびtbl_cを持っています。 switchは実際にはtbl_aのエンティティ(レコード)のプロパティです。しかし、それはtbl_bJOIN、その後tbl_c経由でのみアクセス可能です:

+---------+   +---------+   +---------+ 
    | tbl_a |   | tbl_b |   | tbl_c | 
    +---------+   +---------+   +---------+ 
    | a_id | +--> | b_id | +--> | c_id | 
    | b_fk | <--+ | c_fk | <--+ | switch | 
    +---------+   +---------+   +---------+ 

    +---------+ 
    | tbl_his | 
    +---------+ 
    | his_id | 
    | a_fk | 
    | coef | 
    +---------+ 

私は第四表(tbl_his)を作成する必要がある機能を追加するには - 私が行っています。このテーブルでは、coefの列には1から100の任意の数値をとります。tbl_aのレコードごとにテーブルtbl_hisを1つ設定する必要があります。現在のデータではswitch0または1です。 0の関連switchtbl_aの各レコードに対して

スイッチは私がtbl_hisに次のレコードを追加する必要があり1あるレコードの場合tbl_hisNULL, 'a_id', '100'
として

にレコードを追加する必要がありますI:
NULL, 'a_id', '50'

このクエリはジョブの半分を実行しますか? 50レコードと100レコードを一度に実行する方法はありますか?

INSERT INTO `tbl_his` (`his_id`, `a_fk`, `coef`) VALUES (NULL, 'tbl_a.id', '100') 
WHERE (
SELECT tbl_a.id 
FROM tbl_a 
LEFT JOIN tbl_b ON tbl_a.b_fk = tbl_b.id 
LEFT JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id 
WHERE tbl_c.switch = '0') 
+0

構文が無効です。 'VALUES()'リストの後ろに 'WHERE'はありません。 'FROM \' tbl_a'にバッククォートがありません –

答えて

3

INSERT INTO...WHEREというクエリ構文はありません。あなたが欲しいのはINSERT INTO...SELECTです。

すなわち

INSERT INTO 
    tbl_his (a_fk, coef) 
SELECT 
    tbl_a.id, 
    CASE WHEN tbl_c.switch = 0 THEN 100 ELSE 50 END 
FROM 
    tbl_a 
LEFT JOIN 
    tbl_b 
ON 
    tbl_a.b_fk = tbl_b.id 
LEFT JOIN 
    tbl_c 
ON 
    tbl_b.c_fk = tbl_c.c_id 

MySQL Manual :: Control Flow Functions

+0

ありがとうございました。だからここで 'SELECT'は' VALUES'の仕事をしていますか? –

+1

はい。 SELECTクエリの結果が挿入されます。返される行数が挿入されます。私はすべてを説明しているマニュアルページにリンクしました。 –

+1

+1あなたはCASE Switch WHEN ...;を書くチャンスを逃した) –

1

ジョインにLEFTをドロップします。あなたのwhere句は違法な場所にあります。クエリから値を挿入し、coefを計算します。すべてのスイッチ値が0または1の場合は、最後の行を削除できます。

INSERT INTO tbl_his (his_id, a_fk, coef) 
    SELECT NULL, tbl_a.id, 100-50*tbl_c.switch 
    FROM tbl_a 
    JOIN tbl_b ON tbl_a.b_fk = tbl_b.id 
    JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id 
    WHERE switch BETWEEN 0 AND 1; 
関連する問題