我在MySQL数据库中有一个连续添加记录的表。我想对值的出现进行排名并将其保存到新字段。
我想基于水果的出现,为该特定的人物/姓名填充FruitRank字段。
这是预期的表格 - 名称和水果实时添加到表格中。 应该实时计算和更新FruitRank字段。如何解决这个问题?
姓名|水果| FruitRank(新领域)
艾美|苹果| 1 艾美|苹果| 1 艾美|苹果| 1 艾美|橙色| 2 艾美|橙色| 2汤姆|葡萄| 1
汤姆|葡萄| 1
艾美|猕猴桃| 3 艾美|猕猴桃| 3答案 0 :(得分:0)
您可以在当前表上编写一个AFTER INSERT
触发器,用于计算水果等级并将记录插入另一个表中。您可以使用以下查询来计算排名:
SELECT COUNT(*) into rank
FROM table
WHERE person NEW.person and fruit = NEW.fruit;
获得排名后,您可以执行INSERT
查询以将记录插入另一个表中。
Here是AFTER INSERT
触发器的一个示例。
答案 1 :(得分:0)
从您的示例数据(唯一可用的方式来定义您想要的表结构),不清楚为什么要保留具有完全相同负载的不同记录。
基本上似乎你唯一要更新的是排名。
所以在这种情况下,等级自然会带来更新,比如(而不是插入):
UPDATE fruitRanks SET FruitRank=FruitRank+1 WHERE Fruit = 'apple' AND Name='Amy';
如果您的有效负载确实有差异 - 那么使用单独的表(与AFTER UPDATE触发器一起使用),那么就不需要在每一行中保留Rank。
或者只是放下字段并在需要时通过分组和放大计算它。聚合功能。
答案 2 :(得分:0)
以下是两种可能的方法,在数据库级别,取决于您的需求:
如果有理由在数据库中存储记录每次出现一个人/水果(即你需要节省水果被吃掉的时间等等。),然后没有理由将等级值存储在数据库中,因为每个UPDATE
需要INSERT
。您可以使用COUNT(*)
。
如果没有理由存储每一个事件,那么每个人/水果组合只应有一个条目,其等级值会在每次出现时更新。
查询获得排名:(假设每次出现都存储在 Person_Fruit 表中)
SELECT person, fruit, COUNT(*)
FROM person_fruit
WHERE person = 'the_person'
AND fruit = 'the_fruit'
GROUP BY 1, 2;
假设表格水果(id,person,fruit,rank),人和水果上有multi-column index,所以每个唯一组合只有一次出现。< / em>的
在INSERT
/ UPDATE
之前,检查人/水果是否已存在:
SELECT id
FROM fruits
WHERE name = 'the_name' AND fruit = 'the_fruit';
如果它没有,INSERT
排名为1
的人/水果,因为这是第一次出现:
INSERT INTO fruits (id, person, fruit, rank)
VALUES (NULL, 'the_person', 'the_fruit', 1); /* NULL should be replaced by auto-generated value, if set up for that */
如果是,UPDATE
等级:
UPDATE fruits
SET rank = rank +1
WHERE id = id /* You can use id returned from previous `SELECT`, or Person AND Fruit */