2016-09-30 27 views
1

选择存储过程的一些列我有一个存储过程是这样的:如何在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`()) 

所以,我怎么能选择多列出来的吗?

+0

我想你必须让存储过程将其结果保存在临时表中。然后您可以从该表中选择。有关类似问题,请参阅http://stackoverflow.com/questions/2466713/use-result-set-of-mysql-stored-procedure-in-another-stored-procedure。 – Barmar

+0

无法使用从另一个SQL语句中的过程返回的结果集。该过程不能作为查询的行来源引用。如果您使用SQL Server,则可以编写一个表值函数。在MySQL中最接近的是让程序填充临时表,然后在单独的查询中引用临时表。通过此处显示的示例,过程中的查询可以从过程中取出,并用作内联视图定义。 (用查询代替'调用RankAll',然后分配一个表别名。) – spencer7593

回答

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 
0

只需使用:

call RankAll() 

呼叫returs结果集,如果你将运行相同的SQL查询。

+0

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

+0

MySQL没有表值函数的概念。你需要做的是将结果存储到临时表中并在调用过程/应用程序中使用它。 – slaakso

+0

MySQL临时表对于进程是可见的,而在SQL Server中,临时表在您创建它们的过程中可见。在MySQL中,您可以创建一个临时表,调用过程来填充它,然后在调用之后使用结果集。 So: 如果存在data_tmp,则删除临时表; 创建临时表data_tmp(id int,score int,rank int); 调用RankAll();/*填充data_tmp */ select * from data_tmp; – slaakso