如何创建一个列出一个表中所有名称的表,并计算它在另一个表中出现的次数?

时间:2016-05-26 17:46:27

标签: mysql

我必须创建一个名为vecesCarcel的表,每当我插入一个名称时,它会自动添加另一个单元格,其中包含该名称出现在另一个表中的次数。到目前为止,我已尝试使用触发器,但没有结果:

USE lordfarquaad;

CREATE TABLE IF NOT EXISTS vecesCarcel(
   nombrePersonaje    VARCHAR(10),
   veces              INTEGER(5) UNSIGNED)
   ENGINE=InnoDB;

ALTER TABLE vecesCarcel
  ADD CONSTRAINT vecesCarcelFK1 FOREIGN KEY(nombrePersonaje)
    REFERENCES personajes(nombrePersonaje)
    ON DELETE CASCADE ON UPDATE CASCADE;


USE lordfarquaad;   
DELIMITER $$  


CREATE PROCEDURE checkvecescarcel(IN nombre VARCHAR(10),OUT veces INT(5))
BEGIN 
SET veces=(SELECT COUNT(*) FROM historiales WHERE nombrePersonaje=nombre);
END
$$


CREATE TRIGGER vecesCarcel_Insert BEFORE INSERT ON vecesCarcel FOR EACH ROW
  BEGIN
     CALL checkvecescarcel(NEW.nombrePersonaje,NEW.veces);
  END;
  $$

1 个答案:

答案 0 :(得分:1)

如果你想使用触发器,你必须在触发器中设置new.veces-value:

CREATE TRIGGER vecesCarcel_Insert BEFORE INSERT ON vecesCarcel FOR EACH ROW
    SET new.veces=(SELECT COUNT(*) FROM historiales 
                   WHERE nombrePersonaje=NEW.nombrePersonaje);        

您可能也想创建一个on update - 触发器(相同的代码,因此您可以将select count(*)...放在一个函数中并使用set new.veces = myfnct(new.nombrepersonaje))。

但请记住,如果您更改表historiales中的任何内容,您的计数将不会自动更新(例如,在列表中添加名称中的其他条目)。因此,根据您的设置,以及您的historiales - 表是否可以更改,或者您可能想要尝试其他方法,您可以尝试查看:

create view vecesCarcelView as
select nombrePersonaje, 
       (select count(*) 
        from historiales 
        where vecesCarcel.nombrePersonaje=historiales.nombrePersonaje) as veces
from vecesCarcel;

(如果您对订单不太在意,可以使用left joingroup by执行此操作;您实际上可以使用整个{{1}的视图} -table显示所有已知名称的计数。)