2013-07-29 59 views
1

我需要執行從user_table_a到user_table_b的以下更新。這似乎比我更難,所以我覺得我錯過了一些關於語法的東西。這些是表格結構:MySQL中的動態質量表更新

CREATE TABLE user_table_a (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    email VARCHAR(255), 
    points INT(11) 
); 

CREATE TABLE user_table_b (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    email VARCHAR(255), 
    score INT(11), 
    user_table_a_id INT(11) 
); 

用戶在兩個表中都是由他們的電子郵件值標識的同一個人。電子郵件對系統來說是獨一無二的。在user_table_b中,user_table_a_id字段是新添加的,並且當前爲空。使用電子郵件作爲這兩個表之間的鏈接,我想將每個user_table_a id的正確值更新到user_table_b中相應的位置。我知道這可以通過利用PHP或存儲過程來完成,但我試圖在沒有這些的情況下做到這一點。這是我迄今爲止失敗的查詢:

# this fails because the subquery returns more than one record and ... 
# because a subquery cannot reference the table being update in the main query 
UPDATE user_table_b SET user_table_a_id = (SELECT user_table_a.id FROM user_table_a, user_table_b WHERE user_table_a.email = user_table_b.user_email GROUP BY user_table_a.id) WHERE 1; 

我不確定如果我所嘗試的是可能的,我會繼續研究。感謝任何有幫助的人。

+1

注,而不是user_table_b你的第二個表稱爲user_table_a也。 –

+0

@HamzaKubba確實,xQbert打敗了我。很好,趕上傢伙。 – usumoio

回答

2
UPDATE user_table_b b SET user_table_a_id = (SELECT a.id FROM user_table_a a WHERE a.email = b.email); 
+0

這應該可行,但請注意子查詢比聯接慢得多。 –

+0

我在最終版本的子查詢中使用了限制子句。感謝您向我展示這一點。這是一個強大的工具。 – usumoio

2

您可以對更新使用內部連接。這應該(讓我知道如果不):

UPDATE user_table_b utb 
    INNER JOIN user_table_a uta 
    ON uta.email = utb.email 
    SET utb.user_table_a_id = uta.id;