我必须创建一个名为 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;
$$
最佳答案
如果你想使用触发器,你必须在触发器内设置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
表是否可以更改,或者您只是想尝试不同的方法,您可以尝试 View :
create view vecesCarcelView as
select nombrePersonaje,
(select count(*)
from historiales
where vecesCarcel.nombrePersonaje=historiales.nombrePersonaje) as veces
from vecesCarcel;
(如果您不太关心顺序,您也可以使用 left join
和 group by
来完成此操作;实际上您可以使用查看整个personajes
表以显示所有已知名称的计数。)
关于mysql - 如何创建一个表,列出一个表中的所有名称并统计该名称在另一个表中出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37467774/