无法使MySQL功能正常工作

时间:2014-12-15 05:26:26

标签: mysql function triggers

好的,所以我在MySQL中做了这个小小的练习。我是一个口袋妖怪训练师,需要有胜负记录,我与谁战斗,赚钱。在我到达这一部分之前,所有事情都是花花公子:

*创建一个计算收入的函数,如果战斗赢了那么收益增加,如果战斗是亏损然后收益减少。

我给对手训练师分配了一个"类"从1到4,每位培训师都会提供一定数额的资金 1.- 250 2.- 500 3.- 1000 4.- 2000

我的表格结构或多或少是这样的:

  • 战斗(idBattle,idTrainer,结果,日期,地点)
  • Trainer(idTrainer,nameTrainer,class)
  • 主角(idProtagonist,失败,wons,收入)

我需要查看战斗的结果,知道我的收入是增加还是减少,然后去我的桌子训练师并检查课程,看看课程价值多少,然后返回我将增加多少或减少我的收入。

另外,我想创建一个触发器,在输入新的输入或输入以及更新收入时自动更新我的表(即主训练器表)。我会把代码留下来,我全都干了,不知道现在该做什么。我非常绝望。我可能一直在从这个角度看这个问题,只需要一些建议。 如果你能帮助我的话,很多,非常感谢!

    CREATE DATABASE ricardoRifa;

    USE ricardoRifa;

CREATE TABLE entrenador (//trainer table
    idEntrenador INT NOT NULL DEFAULT 98000,
    nombreEntrenador VARCHAR(20),
    clasificacion INT NOT NULL DEFAULT 1, //this is the trainer class
    PRIMARY KEY (idEntrenador)
)  ENGINE=INNODB;

CREATE TABLE batalla (
    idBatalla INT NOT NULL AUTO_INCREMENT,
    idEntrenador INT,
    resultado BOOLEAN, //false=lost battle, true=won
    lugar VARCHAR(20),
    fecha DATE,
    PRIMARY KEY (idBatalla , idEntrenador),
    CONSTRAINT fk_idEntrenador FOREIGN KEY (idEntrenador)
        REFERENCES entrenador (idEntrenador)
        ON DELETE RESTRICT ON UPDATE RESTRICT
)  ENGINE=INNODB;

CREATE TABLE ricardo (//main trainer table, I wanted it to be like this for there may be more than one instance depending on the main trainer id
    idRicardo INT NOT NULL DEFAULT 11490677,
    perdidas INT NOT NULL DEFAULT 0,
    victorias INT NOT NULL DEFAULT 0,
    ganancias INT NOT NULL DEFAULT 10000,
    PRIMARY KEY (idRicardo)
)  ENGINE=INNODB;

delimiter |
CREATE PROCEDURE incersionEntrenador(idEntrenador INT, nombreEntrenador VARCHAR(20), clasificacion INT)
BEGIN
INSERT INTO entrenador VALUES(idEntrenador, nombreEntrenador, clasificacion);
END |

delimiter |
CREATE PROCEDURE incersionBatalla(idEntrenador INT, resultado BOOLEAN, lugar VARCHAR(20), fecha DATE)
BEGIN
INSERT INTO batalla (idEntrenador, resultado, lugar, fecha) VALUES(idEntrenador, resultado, lugar, fecha);
END |

delimiter |
CREATE FUNCTION calcularGanancia() RETURNS INT
BEGIN
DECLARE class, dinero INT;

SELECT 
    resultado, clasificacion
INTO class FROM
    batalla
        INNER JOIN
    entrenador USING (idEntrenador)
WHERE
    batalla.idEntrenador = entrenador.idEntrenador;


    CASE class
        WHEN 1 THEN SET dinero=250;
        WHEN 2 THEN SET dinero=500;
        WHEN 3 THEN SET dinero=1000;
        WHEN 4 THEN SET dinero=2000;
        ELSE SET dinero=0;
        END CASE;

        IF resultado = TRUE
            THEN SET dinero = dinero * 1;
        ELSE 
            SET dinero = dinero * -1;
        END IF;

            RETURN dinero;   
END |


delimiter |
CREATE TRIGGER ricardoUpdate BEFORE
INSERT ON batalla
FOR EACH ROW BEGIN
UPDATE ricardo
SET perdidas=(SELECT COUNT(resultado) FROM batalla WHERE resultado=FALSE),
victorias=(SELECT COUNT(resultado) FROM batalla WHERE resultado=TRUE),
ganancias= ganancias + (SELECT CALCULARGANANCIA());
END |

我的函数出现错误,错误代码1222:使用的SELECT语句列数不同。

1 个答案:

答案 0 :(得分:0)

[编辑]

该错误通常意味着您必须明确选择已连接表的列。尝试将calcularGanancia()函数中的select更改为以下内容(注意我使用了别名 bat ent ):

declare class, resultado, dinero INT; /* note resultado here and into clause */
select bat.resultado, ent.clasificacion
 into resultado, class
 from batalla bat inner join
      entrenador ent
 ON bat.idEntrenador = ent.idEntrenador;