我有一个这样的存储过程:
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`())
那么如何从中选择多列呢?
答案 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查询一样。