2013-08-26 112 views
0

我試圖創建一個查詢,但我被卡住了。在一個子集內將值從一個字段複製到另一個字段

上下文 在我的網站上,用戶的個人資料上有不同的字段。其中一個領域是通訊的複選框。現在我們要發佈第二份通訊。每個訂閱了時事通訊的用戶都將自動訂閱第二個通訊,並可選擇取消訂閱。未訂閱原始時事通訊的用戶也不應收到第二期通訊。

這些字段存儲在表「Profile_field」中。此表有3列

  • FID =>字段Id(這可能是配置文件的名稱,地址,通訊,...)
  • 的uid =>用戶ID

所以爲每一位用戶,我需要複製的字段1的值字段2

查詢到目前爲止

UPDATE profile_values AS copy 
SET value = 
    (SELECT value 
    FROM (Select Value 
      FROM profile_values as original 
      WHERE fid = 12 
     ) AS temp 
    ) 
WHERE fid=37 
; 

現在,這給我的錯誤:

ERROR 1242 (21000): Subquery returns more than 1 row

我明白爲什麼我有這個。這是因爲在我的子查詢中,我沒有考慮到由於用戶不同而返回多個結果。換句話說,我不考慮用戶。

所以,我想是這樣

FROM (Select Value 
      FROM profile_values as original 
      WHERE fid = 12 
     ) AS temp 
WHERE uid=copy.uid 

但是,這並不工作。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"temp" WHERE uid=copy.uid)where fid=37' at line 1

那麼如何在用戶查詢中考慮用戶呢?

此致

斯蒂芬·塞利斯

+1

我建議重新設計你的數據庫考慮到你有很多用戶和訂閱之間一對多的關係賬戶。 –

+0

這是通過舊的Drupal安裝,所以我不能。如果不是,我會同意你的意見。 –

回答

3

對於更新,我會用:

UPDATE profile_values pv 
     JOIN (SELECT value, 
        uid 
      FROM profile_values 
      WHERE fid = 12) AS current_field_values 
     ON current_field_values.uid = pv.uid 
SET pv.value = current_field_values.value 
WHERE pv.fid = 37 
+0

這工作,thx! –

0

如果你正在處理加入發佈新聞,那麼我會期待一個insert而非update。沿線的一些東西:

insert into profile_values(uid, fid, value) 
    select uid, 37, 1 
    from profile_values pv 
    group by uid 
    having max(fid = 12 and value = 1) > 0; 

也就是說,爲所有具有現有用戶的用戶插入新通訊的新值。

+0

我將需要更新和插入。出於某種原因開始更新。 –

+0

@StephanCelis。 。 。對於你描述的問題,我沒有看到更新適合在哪裏。 –

+0

因爲在我添加字段(以drupal的形式)和執行查詢之間,某些用戶可能已經按他的配置文件上的「保存」按鈕或創建新的配置文件。在這種情況下,在某些情況下,值將爲0而不是1。 –

相關問題