如何在Mysql

时间:2016-09-30 18:18:35

标签: mysql select stored-procedures ranking

我有一个这样的存储过程:

CREATE PROCEDURE `RankAll`()
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
COMMENT ''
BEGIN
    select userID,sum(score) as score,@rank := @rank + 1 AS rank  from
    (
        select userID,score from ScoreMessages  
        union all   
        select userID,score from ScoreExams
    ) as scores
    JOIN (SELECT @rank := 0) rank
    group by userID
    order by score desc;
END

其实我想用它作为一个视图,但我有变量因为我想对它们进行排名而且它不允许我在视图中使用它。

我尝试了下面的查询,但这不正确:

select * from (Call `RankAll`())

那么如何从中选择多列呢?

2 个答案:

答案 0 :(得分:1)

无法使用从另一个SQL语句中的过程返回的结果集。过程不能在查询中作为行源引用。

如果我们使用的是SQL Server,您可以编写一个表值函数。但我们不能在MySQL中这样做。我们在MySQL中最接近的是让一个过程填充一个临时表,然后在一个单独的查询中引用临时表。

使用此处显示的示例,可以从过程中取出查询,并将其用作内联视图定义。也就是说,将Call RankAll()替换为实际查询。并指定一个表别名。

SELECT v.userid
     , v.score
     , v.rank
  FROM ( -- inline view
         SELECT s.userid
              , SUM(s.score) AS score
              , @rank := @rank + 1 AS rank
           FROM ( SELECT m.userid
                       , m.score
                    FROM ScoreMessages m  
                   UNION ALL
                  SELECT e.userid
                       , e.score
                    FROM ScoreExams e
                ) s
          CROSS
           JOIN (SELECT @rank := 0) i
          GROUP BY s.userid
          ORDER BY s.score DESC
       ) v

答案 1 :(得分:0)

只需使用:

call RankAll()

调用会重新调整结果集,就像运行相同的SQL查询一样。