2014-12-15 5 views
0

Итак, я делаю это небольшое упражнение в MySQL. Я тренер покемонов, у которого должен быть рекорд выигрышей и проигрышей, с которыми я сражался, и заработанные деньги. Все идет все денди, пока я не доберусь до этой части:Невозможно заставить MySQL работать

* Создайте функцию, которая рассчитывает прибыль, если битва была выиграна, тогда заработок увеличится, если битва будет убыточной, а прибыль уменьшится.

поручает соперничающие тренер с "классом" от 1 до 4, каждый тренер дает определенную сумму денег 1.- 250 2.- 500 3.- 1000 4.- 2000

Мои таблицы структуры идут более или менее, как это:

  • битвы (idBattle, idTrainer, результат, дата, место)
  • Trainer (idTrainer, nameTrainer, класс)
  • р rotagonist (idProtagonist, проигрывает, воны, доходы)

мне нужно проверить на исход битвы, чтобы знать, если мой доход будет увеличиваться или уменьшаться, а затем перейти на мой стол тренер и проверить класс, чтобы увидеть, сколько это ценность класса, а затем верните, сколько я буду увеличивать или уменьшать свои доходы.

Также я хочу создать триггер, который автоматически обновляет мою таблицу (т. Е. Таблицу главных тренеров), когда будет введена новая победа или потеря, а также обновление заработка. Я оставлю код ниже, я все высох и понятия не имею, что делать сейчас. Я в отчаянии. Возможно, я смотрел на эту проблему из-за угла, просто нужно посоветовать. МНОГО, МНОГО СПАСИБО В РАМКАХ, ЕСЛИ ВЫ МОЖЕТЕ ПОМОЧЬ МНЕ!

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

[редактировать]

Эта ошибка обычно означает, что вы должны явно выбрать столбцы ваших соединяемых таблиц. Попробуйте изменить ваш выбор в функции calcularGanancia() на что-то вроде следующего (обратите внимание, я использовал псевдонимы летучей мыши и лор):

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; 
+0

я получаю ту же ошибку, но спасибо. И почему вы верите, где не нужно? Это избыточно? – Karnkuret

+0

ДА! с вашим новым изданием он работал !!!! Я не отвлекался на результат, так что немой я устал. БЛАГОДАРЯ! – Karnkuret