Mysql - 根据值的出现进行排名

标签 mysql real-time rank

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

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

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

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

艾米 |苹果| 1

艾米 |苹果| 1

艾米 |苹果| 1

艾米 |橙色| 2

艾米 |橙色| 2

汤姆|葡萄 | 1

汤姆 |葡萄 | 1

艾米 |猕猴桃 | 3

艾米 |猕猴桃 | 3

最佳答案

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

  • 如果有理由在数据库中存储每一次出现的人物/水果的记录(即您需要保存吃水果的时间等) ),那么就没有理由将排名值存储在数据库中,因为这需要每次 INSERT 进行 UPDATE。您可以使用 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),其中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 fruits 
SET rank = rank +1
WHERE id = id        /* You can use id returned from previous `SELECT`, or Person AND Fruit */

关于Mysql - 根据值的出现进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42236855/

相关文章:

sql - 从 2 个表中计算高分排名

mysql - 使用列别名作为排序键的 Spring 批处理 - 格式错误的 "where"语句

mysql - yii FULLTEXT 索引匹配查询

linux - preempt_rt 的缺点

按两列排名并保持联系

r - R 如何进行精确的 wilcoxon 秩和检验?

mysql - 从 MySQL 数据库中删除第一行

python - 属性错误: module 'pymysql.constants.ER' has no attribute 'CONSTRAINT_FAILED' in pymysql Python

java - 如何在执行事件时创建动态 android Path 对象?

java - 如何处理网络中断并克服它而不丢失数据?