【问题标题】:Convert SQL statement into mySQL stored procedure将 SQL 语句转换为 mySQL 存储过程
【发布时间】:2010-12-21 17:26:54
【问题描述】:

我有一段 SQL 可以计算出高尔夫球手在排行榜上的排名。我对 Spring 很陌生,我认为我无法使用 Spring JDBC 执行此操作,因此我认为我需要将其转换为 mySQL 存储过程。

谁能给我一些关于我需要转换什么的指示?简单地把 CREATE PROCEDURE 和参数列表放在这个周围是行不通的。

SET @rank = 1, @prev_val = NULL, @prev_rank = NULL;
SELECT rank FROM
(
 SELECT @rank := IF(@prev_val!=winnings,@prev_rank+1,@rank) AS rank
     , @prev_val := winnings AS winnings
     , @prev_rank := @rank AS prevRank
     , t.golferID
  FROM 
     (
        select g.golferID, sum(winnings) as winnings 
        from results r
        join resultDetails rd on r.resultID = rd.resultID
        join golfers g on rd.golferID = g.golferID
        where r.status = 'C' and r.compID = 1 
        group by golferID order by winnings desc
     ) AS t
) AS showRank WHERE golferID = 16

【问题讨论】:

  • 你应该接受一个答案,保罗。我们的想法是在此处标记正确且最有帮助的答案。

标签: java mysql spring stored-procedures


【解决方案1】:

这会让你开始:

drop procedure if exists get_golfer_rank;

delimiter #

create procedure get_golfer_rank
(
p_golferID int unsigned
)
proc_main:begin

set @rank = 0;

select 
...
where golferID = p_golferID;

end proc_main #

delimiter ;


call get_golfer_rank(18);

【讨论】:

    【解决方案2】:

    您的锻炼很好 - f00 假设您只想通过给定参数调用每个高尔夫球手的排名 - 因此构造...

    create procedure get_golfer_rank
    (
    p_golferID int unsigned
    )
    

    还有……

    where golferID = p_golferID;
    

    仅限于单个高尔夫球手。

    【讨论】:

      【解决方案3】:

      感谢您的线索。我解决了。粗略地说是

      drop procedure if exists getRank;
      
      delimiter $$
      
      create procedure getRank()
      begin
      
          set @rank = 1; 
          set @prev_val = NULL;
          set @prev_rank = NULL;
      
          select rank from
          (
           select @rank := if(@prev_val!=winnings,@prev_rank+1,@rank) as rank
               , @prev_val := winnings as winnings
               , @prev_rank := @rank as prevrank
               , t.golferid
            from 
               (
                  select g.golferid, sum(winnings) as winnings 
                  from results r
                  join resultdetails rd on r.resultid = rd.resultid
                  join golfers g on rd.golferid = g.golferid
                  where r.status = 'c' and r.compid = 1 
                  group by golferid order by winnings desc
               ) as t
          ) as showrank where golferid = 16;
      
      end; $$
      
      delimiter ;
      

      【讨论】:

      • 您不想将高尔夫球手 id 作为参数传递吗??
      猜你喜欢
      • 1970-01-01
      • 2015-08-28
      • 2015-10-24
      • 2021-08-17
      • 2011-02-15
      • 1970-01-01
      • 2012-08-10
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多