如何 select Mysql 中存储过程的某些列

How to select some columns of a stored procedure in Mysql

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

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`())

那么我怎样才能 select 多列呢?

只需使用:

call RankAll()

该调用返回结果集,就像您运行 相同的 SQL 查询一样。

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

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

对于此处显示的示例,可以将查询从过程中取出,并用作内联视图定义。即,将 Call RankAll() 替换为实际查询。当然还要分配一个 table 别名。

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