2016-07-25 45 views
1

我在创建组排名的MySQL If语句时遇到问题。这里是MySQL声明:MySQL如果声明和递增

SELECT EnCode, EnName, QuScore, 
@scorerank := IF(@currathlete = EnCode, @scorerank + 1, 1), 
@currathlete := EnCode 
FROM ranking ORDER BY EnCode, QuScore DESC 

目前,它提供了以下输出

'1004277','Ashe','1628','1','1004277' 
'1004277','Ashe','1309','1','1004277' 
'1004277','Ashe','1263','1','1004277' 
'1004277','Ashe','648','1','1004277' 
'1004277','Ashe','645','1','1004277' 
'1004277','Ashe','1628','1','1004277' 
'1015934', 'Sabina', '544', '1', '1015934' 
'1015934', 'Sabina', '455', '1', '1015934' 
'1015934', 'Sabina', '276', '1', '1015934' 
'1015934', 'Sabina', '216', '1', '1015934' 

它所应该具有相同的代码的每一行做的是增加每一个“1”号的一个,然后再从1开始,当它看到一个不同的代码号(1004277,然后是1015934在这种情况下)

任何帮助表示赞赏,因为我在网上使用上述方法遵循一些示例,但似乎击中了发出这一点。

+0

给我你所需要的结果的图像。这算什么,你的意思是 '1004277', '阿什', '1628', '1', '1004277',1 '1004277', '阿什', '1309', '1', '1004277',2 “ 1004277' , '阿什', '1263', '1', '1004277',3 '1004277', '阿什', '648', '1', '1004277',4 '1004277', '阿什' , '645', '1', '1004277',5 '1004277', '阿什', '1628', '1', '1004277',6 '1015934', '臭', '544',' 1' , '1015934',1 '1015934', '臭', '455', '1', '1015934',2 '1015934', '臭', '276', '1', '1015934' ,3 '1015934','Sabina','216','1','1015934',4 –

+0

嗨,是的结果应该看起来像下面的样子(第四列是需要递增的等级号):'1004277 ','Ashe','1628','1','1004277' '1004277','Ashe','1309','2','1004277' '1004277', '阿什', '1263', '3', '1004277' '1004277', '阿什', '648', '4', '1004277' '1004277', '阿什',” 645' , '5', '1004277' '1015934', '臭', '544', '1', '1015934' '1015934', '臭', '455', '2', '1015934' '1015934', '臭', '276', '3', '1015934' '1015934', '臭', '216', '4', '1015934' 由于 –

+0

我有你问题的解决方案..你还在吗?@Robert –

回答

1

在存储过程尝试这种方式:

drop PROCEDURE if EXISTS INCREMENTME; 
create PROCEDURE INCREMENTME() 
BEGIN 

DECLARE OldEnNamevar VARCHAR(10) DEFAULT NULL; 
DECLARE done INT DEFAULT FALSE; 
DECLARE Encodevar VARCHAR(10); 
DECLARE EnNamevar VARCHAR(10); 
DECLARE QuScorevar VARCHAR(10); 
DECLARE scorerankvar VARCHAR(10); 
DECLARE currathalthletevar VARCHAR(10); 
DECLARE countcode int(29) DEFAULT(1); 
DECLARE counter int(20) default 0; 

DECLARE get_cur CURSOR FOR select `Encode`,`EnName`,`QuScore`,`scorerank`,`currathalthlete` from tbl_ranking; 
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
drop table if exists temp_temptable; 
create TEMPORARY table temp_temptable(Encodevar VARCHAR(50) NULL,EnNamevar VARCHAR(50) NULL,QuScorevar VARCHAR(50) NULL,scorerankvar VARCHAR(50) NULL,currathalthletevar VARCHAR(50) NULL,recordCount int(10) null); 

OPEN get_cur; 

REPEAT 

set counter = counter + 1; 
     FETCH get_cur INTO Encodevar,EnNamevar,QuScorevar,scorerankvar,currathalthletevar; 


     if (OldEnNamevar = EnNamevar) THEN 

      set countcode = countcode +1; 

     ELSE 
      if(counter=1) then 
           set countcode = 1; 

      ELSE 
        set countcode = 0; 
      end if; 

     end if; 

     if (OldEnNamevar != EnNamevar) THEN 
      set countcode = 1; 
     end if; 

    if(OldEnNamevar=NULL) then 
        set countcode = 1; 
    end if; 


insert into temp_temptable (Encodevar,EnNamevar,QuScorevar,scorerankvar,currathalthletevar,recordCount) values(Encodevar,EnNamevar,QuScorevar,scorerankvar,currathalthletevar,countcode); 
set OldEnNamevar = EnNamevar; 


UNTIL done END REPEAT; 

select * from temp_temptable; 

drop temporary table if exists temp_temptable; 
CLOSE get_cur; 




END 

呼叫这样的过程: 呼叫INCREMENTME();

这里的结果: enter image description here

+0

谢谢@reds该解决方案完美工作,坐在存储过程中很好,这是一个更好的实现方式我需要什么。 –

+0

好的伙计..欢迎..只需要帮助 –

1

你必须初始化你的变量,否则它们是null(至少在会话开始时,如果你运行两次,可能不再有),并且你的查询会给出奇怪的结果。尝试

SELECT EnCode, EnName, QuScore, 
    @scorerank := IF(@currathlete = EnCode, @scorerank + 1, 1), 
    @currathlete := EnCode 
FROM ranking, (select @currathlete := '', @scorerank := 0) init 
ORDER BY EnCode, QuScore DESC 
+0

谢谢@solarflare那工作太多了,我没有意识到他们需要初始化 –