2015-07-17 2 views
-1

J'ai donc trouvé un post qui parlait de mettre certains tests logiques derrière HAVING au lieu de WHERE. Qu'est-ce qui me manque, c'est encore l'erreur de déclenchement 1111?Erreur 1111 lors de l'appel d'une fonction stockée

DROP PROCEDURE IF EXISTS ELO; 

DELIMITER // 

CREATE PROCEDURE ELO() 
BEGIN 

-- declares... 

label1: WHILE xGame <= max(games.game_id) DO 
    SELECT games.game_id, games.game_type, games.date, games.home_team, games.away_team, games.runs0, games.runs1 
     FROM games 
     WHERE games.game_id = xGame 
     HAVING (games.game_type = 0 OR games.game_type = 3) 
     INTO @id, @ty, @d, @home, @away, @homeR, @awayR; 

    SET startHomeELO = (SELECT team_elo.team_id, team_elo.date, team_elo.elo FROM team_elo WHERE team_id = home HAVING min(d - team_elo.date)); 
    SET startAwayELO = (SELECT team_elo.team_id, team_elo.date, team_elo.elo FROM team_elo WHERE team_id = away HAVING min(d - team_elo.date)); 

    SET eloDiff = abs((startHomeELO + 25) - startAwayELO); 

    SET homeELO = (startHomeELO + (40*power(runDiff, (1/3)) * (homeWin - (1/(power(10, (eloDiff/400)) + 1))))); 
    SET awayELO = (startAwayELO + (40*power(runDiff, (1/3)) * (awayWin - (1/(power(10, (eloDiff/400)) + 1))))); 

    INSERT INTO team_elo (team_id, game_id, date, elo) VALUES (home, id, d, homeELO); 
    INSERT INTO team_elo (team_id, game_id, date, elo) VALUES (away, id, d, awayELO); 

    SET xGame = xGame + 1; 

END WHILE label1; 
END; // 

CALL ELO(); 
+1

Je ne pense pas que vous pouvez utiliser 'MAX()' en dehors d'une requête comme ça. – Barmar

Répondre

0

Vous devez faire une requête distincte pour obtenir l'ID maximale:

INT maxId; 

SELECT MAX(game_id) INTO maxId 
FROM games; 

label1: while xGame <= maxId DO 
    ... 
END WHILE label1;