2011-06-24 11 views
1

UNIONクエリを使用して5つのテーブルのいずれかで電子メールアドレスを検索するMYSQLストアドプロシージャを作成する必要があります。電子メールアドレスが見つかると、ストアドプロシージャは元のテーブルのフィールドを更新し、その情報を別のテーブルに挿入する必要があります。ここで MySQL - ストアドプロシージャ - ユニオンが更新と挿入を選択します

は私の労働組合です:

SELECT email, 'table1' AS nameoftable, status FROM table1 
WHERE email = '[email protected]' 
UNION 
SELECT email, 'table2' AS nameoftable, status FROM table2 
WHERE email = '[email protected]' 
UNION 
SELECT email, 'table3' AS nameoftable, status FROM table3 
WHERE email = '[email protected]' 

これは一つのレコードを返す必要があり、私が次のステップに必要なnameoftable変数を与える例: [email protected]

まずTABLE1挿入する: INSERT INTOブラックリスト(電子メール、tablename、追加)SELECT email、 'nameoftable'、FROM nameoftable where email = '[email protected]';

更新日: UPDATE nameoftable SET status = 'D' WHERE email = '[email protected]';

もちろん、レコードがない場合は、手順を終了する必要があります。

私はこのすべてを1つのストアドプロシージャにロールバックしようとしています。このストアドプロシージャは、要求に応じてさまざまなリストから電子メールを削除する電子メールプログラムで使用されます。今、私は手でそれをやっています、そして、それは面倒です。

私は指針やアイデアを感謝します。前もって感謝します。

答えて

0

あなたの問題は、変数にtablenameがあるようですが、あなたは通常のSQLのことをするために、その変数の値を識別子に変換する必要があります。

IF nameoftable = 'table1' THEN 
    UPDATE table1 SET status = 'D' WHERE email = '[email protected]'; 
ELSEIF nameoftable = 'table2' THEN 
    UPDATE table2 SET status = 'D' WHERE email = '[email protected]'; 
-- etc 
END IF; 

それとも、(、多かれ少なかれ、evalの形である)a prepared statementを使用することができます::

PREPARE stmt FROM CONCAT('UPDATE ', nameoftable, ' SET status = ? WHERE email = ?'); 
EXECUTE stmt USING 'D', '[email protected]'; 

私はCONCATが動作することを確信しているあなたは、ややugly like this何かそうでしその文脈ではなく場合は、変数としてSQLを構築することができますし、PREPAREその:

SET @update = CONCAT('UPDATE ', nameoftable, ' SET status = ? WHERE email = ?'); 
PREPARE stmt FROM @update; 
EXECUTE stmt USING 'D', '[email protected]'; 

あなたprocedurの残りの部分変数の値をSQL識別子に変換するという問題を乗り越えれば、まっすぐ進むことができます。

関連する問題