存储过程计数问题

时间:2012-08-29 00:05:04

标签: mysql stored-procedures

我有一个表[users],我希望计算每次出现的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 //

2 个答案:

答案 0 :(得分: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表中的信息可能已过期。

答案 1 :(得分:0)

我认为你可以在没有循环的情况下做到这一点:

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