【问题标题】:Mysql - ranking based on occurrence of a valueMysql - 基于值的出现排名
【发布时间】:2017-02-14 21:47:27
【问题描述】:

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

我想根据水果的出现来填充该特定人员/姓名的 FruitRank 字段。

这是预期的表格 - 名称和水果会实时添加到表格中。 FruitRank 字段应实时计算和更新。这个怎么办?

姓名 |水果 | FruitRank(新字段)

艾米 |苹果| 高分辨率照片| CLIPARTO 1

艾米 |苹果| 高分辨率照片| CLIPARTO 1

艾米 |苹果| 高分辨率照片| CLIPARTO 1

艾米 |橙色| 2

艾米 |橙色| 2

汤姆 |葡萄| 1

汤姆 |葡萄| 1

艾米 |猕猴桃 | 3

艾米 |猕猴桃 | 3

【问题讨论】:

    标签: mysql real-time rank


    【解决方案1】:

    根据您的需要,在数据库级别有两种可能的方法:

    • 如果有理由在数据库中存储每次个人/水果的记录(即您需要保存水果被吃掉的时间等) ),那么就没有理由将排名值存储在数据库中,因为这需要UPDATE 和每个INSERT。您可以使用COUNT(*) 进行简单查询来获得排名。

    • 如果没有理由存储每次出现,那么每个人/水果组合应该只有一个条目,其排名值会在每次后续出现时更新。

    使用聚合函数检索的排名

    获取排名的查询:(假设每个事件都存储在 Person_Fruit 表中)

    SELECT person, fruit, COUNT(*)
    FROM person_fruit
    WHERE person = 'the_person'
      AND fruit = 'the_fruit'
    GROUP BY 1, 2;
    

    存储在数据库中的排名

    假设表 Fruits(id、person、fruit、rank),在 person 和 fruit 上都有 multi-column index,所以每个唯一组合只有一次出现。

    INSERT/UPDATE之前,检查Person/Fruit是否已经存在:

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

    【讨论】:

      【解决方案2】:

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

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

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

      HereAFTER INSERT 触发器的示例。

      【讨论】:

        【解决方案3】:

        从您的示例数据中(以某种方式定义您想到的表结构的唯一可用方法)尚不清楚为什么要保留具有完全相同有效负载的不同记录。

        基本上看来,您要更新的唯一内容是排名。

        所以在这种情况下,排名自然会随着更新(而不是插入):

        UPDATE fruitRanks SET FruitRank=FruitRank+1 WHERE Fruit = 'apple' AND Name='Amy';
        

        如果您的有效负载确实存在差异 - 然后使用单独的表(结合 AFTER UPDATE 触发器),则无需在每一行中保留排名。

        或者只是删除字段并在需要时使用分组和聚合功能进行计算。

        【讨论】:

          猜你喜欢
          • 2016-03-18
          • 2021-01-04
          • 1970-01-01
          • 2015-09-08
          • 2023-03-25
          • 2022-11-02
          • 2013-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多