Mysql - 基于值

时间:2017-02-14 21:47:28

标签: mysql real-time rank

我在MySQL数据库中有一个连续添加记录的表。我想对值的出现进行排名并将其保存到新字段。

我想基于水果的出现,为该特定的人物/姓名填充FruitRank字段。

这是预期的表格 - 名称和水果实时添加到表格中。 应该实时计算和更新FruitRank字段。如何解决这个问题?

姓名|水果| FruitRank(新领域)

艾美|苹果| 1

艾美|苹果| 1

艾美|苹果| 1

艾美|橙色| 2

艾美|橙色| 2

汤姆|葡萄| 1

汤姆|葡萄| 1

艾美|猕猴桃| 3

艾美|猕猴桃| 3

3 个答案:

答案 0 :(得分:0)

您可以在当前表上编写一个AFTER INSERT触发器,用于计算水果等级并将记录插入另一个表中。您可以使用以下查询来计算排名:

SELECT COUNT(*) into rank
FROM table 
WHERE person NEW.person and fruit = NEW.fruit;

获得排名后,您可以执行INSERT查询以将记录插入另一个表中。

HereAFTER 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 */