2016-07-25 53 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那工作太多了,我沒有意識到他們需要初始化 –