如何 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
我有一个这样的存储过程:
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