2013-05-27 20 views
2

我查了幾種方式來通過SELECT更新多個列,但仍然無法使其工作。這是我試過的:如何在MYSQL中一次更新多列?

delimiter @@ 
CREATE TRIGGER trigger_sales 
AFTER INSERT ON orders 
FOR EACH ROW 
BEGIN 
UPDATE sales 
SET (userid, productid, transaction, price, quarter) = 
SELECT userid, productid, COUNT(productid) AS transaction, SUM(total_P) AS price, 
     case when (month(date)) >=3 and (month(date)) <=5 then 'Spring' 
      when (month(date)) >=6 and (month(date)) <=8 then 'Summer' 
      when (month(date)) >=9 and (month(date)) <=11 then 'Fall' 
      else 'Winter' 
      end AS quarter 
FROM orders  
GROUP BY userid, productid, quarter 
[email protected]@ 
delimiter; 

謝謝!

+0

你想'UPD​​ATE'或'INSERT'新的價值?表格訂單和銷售之間有任何關係嗎? – GregD

+0

我想更新。是的,銷售表格會計算同一用戶在不同季度放置的特定產品的訂單數量。 –

+0

這些表之間的任何關係? – GregD

回答

4

我這樣做的首選方法是做一個INSERT查詢,確保每個插入都有一個已被使用的主鍵。然後,我添加ON DUPLICATE KEY UPDATE,通過`column`=VALUES(`column`)表單中的所有字段,這很好。這通常適用於外鍵。

+0

你能詳細說一下你說的嗎?我的銷售表有兩個外鍵userid和productid。 當用戶標識,生產訂單和訂單處理單位尚未處於銷售狀態時,我想爲銷售額插入一個新行。如果它們已經存在,我想更新交易到交易+1並更新總價。 –

3

我已經測試了您的查詢,沒有任何示例數據,但此解決方案可能會將您設置在正確的軌道上。我以前VIEW克服GROUP BY限制,同時在多個表上使用UPDATE

CREATE VIEW orders_view AS 
    SELECT userid, 
      productid, 
      COUNT(productid) AS 'transaction', 
      SUM(total_P) AS price, 
      CASE 
     WHEN (MONTH(o.date)) >=3 AND (MONTH(o.date)) <=5 THEN 'Spring' 
     WHEN (MONTH(o.date)) >=6 AND (MONTH(o.date)) <=8 THEN 'Summer' 
     WHEN (MONTH(o.date)) >=9 AND (MONTH(o.date)) <=11 THEN 'Fall' 
       ELSE 'Winter' 
      END AS quarter  
     FROM orders  
    GROUP BY userid, productid, quarter; 

    UPDATE sales s, orders_view o 
     SET s.userid = o.userid, 
      s.productid = o.productid, 
      s.`transaction` = o.`transaction`, 
      s.price = o.price, 
      s.quarter = o.quarter 
     WHERE s.userid = o.userid; 

請注意,我沒有真實的數據進行了測試。

的更多信息: