2012-08-29 87 views
1

我有一個表[用戶],我希望計算Movie_ID的每個出現次數,並更新另一個名爲[total]的表中的記錄。因此,對於Movie_ID = 81212,它會將值2發送到我的[total]表。存儲過程計數問題

象下面這樣:

 ------------------------------------ 
     | [users]       | [total] 
    +---------+---------+    +---------+-------------+ 
    |Movie_ID |Player_ID|    |Movie_ID | Player_Count| 
    +---------+---------+    +---------+-------------+ 
    |81212 |P3912 |    | 81212 |  2  | 
    +---------+---------+    +---------+-------------+ 
    |12821 |P4851 |    | 12821 |  1  | 
    +---------+---------+    +---------+-------------+ 
    |81212 |P5121 | 
    +---------+---------+ 
(movie_ID + player_ID form composite key 
so Movie_ID does not need to be unique) 

所以我想用一個存儲過程來做到這一點,這是我迄今爲止:我不知道如何將部分代碼而循環遍歷[users]表中的每個條目,以查找每個movie_id的發生並對其進行總結。

DELIMITER // 

CREATE PROCEDURE `movie_total` (OUT movie_count int(5)) 
LANGUAGE SQL 
MODIFIES SQL DATA 
BEGIN 

DECLARE movie_count int(5); 

SELECT count(movie_id) AS movie_count FROM users 
foreach unique row in Users ; 

    IF (SELECT COUNT(*) FROM users WHERE movie_id) > 0 
    THEN 
    INSERT INTO total (:movie_id, :Player_Count) VALUES (movie_id, movie_count); 


END // 

回答

1

要更新這個字段,你可以使用這樣的查詢 -

UPDATE 
    total t 
    JOIN (SELECT Movie_ID, COUNT(*) cnt FROM users GROUP BY Movie_ID) m 
    ON t.Movie_ID = m.Movie_ID 
SET 
    t.Player_Count = cnt 

但是:你真的需要一個total表?您始終可以使用SELECT查詢獲取此信息;並且total表中的信息可能已過時。

+0

那麼我打算在每次更新用戶表時運行該過程。 – Undermine2k

+0

在這種情況下,您可以使用觸發器。 – Devart

0

我認爲你可以做到這一點沒有一個循環:

update total set total.Player_Count = (select COUNT(Movie_ID) from users where total.Movie_ID=users.Movie_ID group by (Movie_ID));