2013-08-16 135 views
5

我有一個查詢這給像MySQL查詢需要優化

id | productid | userid | coinsid 
1 | 2   | 2  | 5  
3 | 2   | 2  | 6  
4 | 2   | 3  | 7 
5 | 2   | 4  | 8 
6 | 2   | 3  | 9 

這是導致特定productid結果。現在我必須更新user table中的餘額,在上面的結果中爲所有用戶添加$ 1,但如果userid是兩次,我需要爲該特定用戶的餘額添加兩次$ 1。所以在上面的情況下1美元兩次加到userid=2餘額和userid=3餘額。

簡單的方法是爲每個不同的userid計數記錄並運行查詢的次數與我們有foreach循環中的用戶一樣多。但我正在尋找一些優化方式。請提出任何建議。謝謝

+0

按用戶ID和sum coinsID對查詢結果進行分組添加用戶ID計數的列乘以$ 1的用戶ID計數,並用該新值更新coinsId。 – xQbert

+0

@AliBZ,是'balance'是用戶表中的列名。我需要更新餘額。 –

+0

對不起,我的錯,我錯過了那部分。 – AliBZ

回答

4

一種方法:

UPDATE user_table u 
    JOIN (SELECT q.userid 
       , SUM(1.00) AS deposit 
      FROM (
        -- original OP query goes here 
       ) q 
      GROUP BY q.userid 
     ) r 
    ON r.userid = u.userid 
    SET u.balance = u.balance + r.deposit 

我們使用原來的O​​P查詢,返回所顯示的結果集,並作出內嵌視圖(化名查詢上面q)。

由此,我們查詢一個不同的userid列表,以及userid在結果集中出現的次數。這給了我們用戶名和存款金額(用戶每次出現1美元)(某些數據庫可能希望我們將值指定爲1.0而不是1,以確保它是十進制的。我認爲SUM更具代表性)

我們將該內嵌視圖(r)加入到用戶表中,並將該存款金額添加到該用戶的當前餘額(假設餘額以十進制美元形式存儲( 1。00 =一元)


測試,轉換UPDATESELECT聲明:

  • 刪除 「SET」 條款
  • 增加一個 「ORDER BY」 條款(可選),使結果確定
  • 刪除「UPDATE」關鍵字並將其替換爲

與:

SELECT r.userid 
     , r.deposit 
     , u.balance    AS old_balance 
     , u.balance + r.deposit AS new_balance 
     , u.userid 
    FROM 

全部選擇:

SELECT r.userid 
     , r.deposit 
     , u.balance    AS old_balance 
     , u.balance + r.deposit AS new_balance 
     , u.userid 
    FROM user_table u 
    JOIN (SELECT q.userid 
       , SUM(1.00) AS deposit 
      FROM (
        -- original OP query goes here 
       ) q 
      GROUP BY q.userid 
     ) r 
    ON r.userid = u.userid 

沒有WHERE子句,連接謂詞(ON子句中)是什麼決定哪些行被選擇/在用戶表中受到影響。

+0

(以前缺少加入標準...... DOH!fixed。 – spencer7593

+0

感謝您的回覆。我試過了,它爲我更新了餘額,但不幸的是所有用戶的餘額都已更新,在更新查詢結束時是否需要where子句? –

+0

現在工作完美,讓我嘗試多個用戶:) –

0
select count(*), userid from yourTable group by userid 

如果我明白你的問題。

1

假設你已經在你的資產負債表中沒有重複的用戶ID,也許像這樣的工作:

update balance_table set balance_table.balance = (select count(*) from users_table where users_table.user_id = balance_table.user_id) * 1; 

,因爲我比較熟悉PLSQL我還沒有試過在MySQL數據庫上此查詢,但會不會像這樣工作?

+0

在這種情況下,* 1是因爲您想爲每個用戶添加1美元,但可以更改爲任何金額。 – schwarz

+0

不重複,但多個用戶ID,所以它不會工作,我認爲。 –

1

在其他答案中的相關子查詢將起作用,但INNER JOIN通常會更有效。嘗試這樣的事情;你當然需要提供表名和列名。

UPDATE myTable 
INNER JOIN (
    SELECT userid, count(*) AS AmountToAdd 
    FROM users 
    GROUP BY userid 
) UserCounts ON myTable.userid = UserCounts.userid 
SET balance = balance + UserCounts.AmountToAdd 
+0

這是一個可行的方法。但是這個查詢中的內聯視圖是'FROM users',但是OP表明用戶列表是查詢的結果(沒有給出查詢的實際文本)。因此OP需要替換'FROM users'與'FROM(SELECT/*原始查詢* /)別名'。每當在查詢中引用多個表時,最佳做法是限定所有列引用。 – spencer7593