2017-02-14 96 views
0

的發生我在MySQL數據庫中的表,其記錄被添加continuously.I要排名的值的發生,並將其保存到一個新的領域排名。MySQL的 - 基於價值

我想根據水果的發生情況爲該特定人物/名稱填充FruitRank字段。

這裏是預期的表 - 姓名和水果被添加到表的實時性。 FruitRank字段應該實時計算和更新。如何去做這件事?

名稱|水果| FruitRank(新場)

艾米|蘋果| 1

Amy |蘋果| 1

Amy |蘋果| 1

Amy |橙色| 2

艾米|橙色| 2

Tom |葡萄| 1

Tom |葡萄| 1

Amy |獼猴桃| 3

Amy |獼猴桃| 3

回答

0

您可以在當前表上編寫一個AFTER INSERT觸發器來計算果實級別並將記錄插入到另一個表中。您可以使用下面的查詢來計算排名:

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

一旦你的排名,你可以執行INSERT查詢到的記錄插入到另一個表。

HereAFTER INSERT觸發的示例。

0

從您的示例數據(唯一可用的方式來以某種方式定義您想要的表結構)不清楚爲什麼應該保留具有完全相同有效負載的不同記錄。

它基本上看來你要更新的唯一的事情 - 就是排名。

因此,在這種情況下,排名自然地像(而不是插入)更新來:

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

如果你在你的有效載荷差 - 然後使用單獨的表(連同AFTER UPDATE觸發器),那麼就不需要在每一行中保留秩。

或者只是刪除該字段並根據需要計算它與分組&聚合函數。

0

這裏有兩種可能的方法,在數據庫級別,根據您的需要:

  • 如果有一個理由來存儲在數據庫中出現一個人/水果的記錄(即您需要節省吃水果的時間等),那麼沒有理由將等級值存儲在數據庫中,因爲每個INSERT需要UPDATE。您可以通過使用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對人和水果,所以你只有一個獨特的組合發生。

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