2011-06-24 110 views
1

我需要創建一個MYSQL存儲過程,它將使用UNION查詢來查找五個表中的一個表中的電子郵件地址。一旦找到電子郵件地址,存儲過程需要更新原始表中的字段,並將信息插入到另一個表中。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的一個

第一插入: 插入黑名單(電子郵件,表名,添加)選擇電子郵件,'nameoftable',添加從nameoftable WHERE email ='[email protected]';

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

當然,如果沒有記錄,程序應該退出。

所以,我試圖將這一切都推入一個存儲過程。此存儲過程將與電子郵件程序一起使用,該程序將根據請求從各種列表中刪除電子郵件。現在,我正在手工做,而且它變得乏味。

我會很感激任何指針或想法。提前致謝。

回答

0

你的問題似乎是你在一個變量中有一個表名,但你需要把該變量的值變成一個標識符,這樣你就可以用它做普通的SQL事情。你可以這樣的東西有點ugly like this

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; 

或者你可以使用a prepared statement(這是多還是少,一個的eval形式):

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

我敢肯定的是,CONCAT將工作在這方面,但如果沒有,你可以建立SQL作爲一個變量和PREPARE認爲:

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

你再修改的其餘部分一旦你解決了將變量的值轉換爲SQL標識符的問題,e看起來很簡單。