好的,所以我在MySQL中做了这个小小的练习。我是一个口袋妖怪训练师,需要有胜负记录,我与谁战斗,赚钱。在我到达这一部分之前,所有事情都是花花公子:
*创建一个计算收入的函数,如果战斗赢了那么收益增加,如果战斗是亏损然后收益减少。
我给对手训练师分配了一个"类"从1到4,每位培训师都会提供一定数额的资金 1.- 250 2.- 500 3.- 1000 4.- 2000
我的表格结构或多或少是这样的:
我需要查看战斗的结果,知道我的收入是增加还是减少,然后去我的桌子训练师并检查课程,看看课程价值多少,然后返回我将增加多少或减少我的收入。
另外,我想创建一个触发器,在输入新的输入或输入以及更新收入时自动更新我的表(即主训练器表)。我会把代码留下来,我全都干了,不知道现在该做什么。我非常绝望。我可能一直在从这个角度看这个问题,只需要一些建议。 如果你能帮助我的话,很多,非常感谢!
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语句列数不同。
答案 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;