我在 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/