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

标签 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;
  $$

最佳答案

如果你想使用触发器,你必须在触发器内设置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 joingroup by 来完成此操作;实际上您可以使用查看整个personajes表以显示所有已知名称的计数。)

关于mysql - 如何创建一个表,列出一个表中的所有名称并统计该名称在另一个表中出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37467774/

相关文章:

php - 带有 form_helper 输入的 Codeigniter 下拉表单是索引/键而不是所选的值

c# - 通过 wcf 服务调用时数据库连接不起作用

mysql - 没有 JOIN 的 SQL 查询

php - localhost 是,但 phpmyadmin 空白

php - PHP 和 MySQL 之间的周数差异

MySQL 连接查询任务

python - Sam 本地的 mysql 数据库连接

python - 自动启动PYTHON脚本

mysql - Symfony2 验证约束

mysql - 在 SQL 中使用 Group By 函数时遇到问题