2013-02-23 49 views
0

如果新行是針對特定用戶的第4行,是否可以創建沒有其他的腳本/如果刪除用戶的最舊行?每個用戶的表中最多3行

我有一張名爲points_history的表。字段是:

日期(日期時間), fk_player_id(INT), 點(INT)

這裏是我的插入:

mysqli_query($mysqli,"INSERT INTO points_history (date,fk_player_id,points) VALUES (NOW(),$player,$points)"); 

這樣做的原因taht我希望能夠到回顧球員的歷史和檢查點,但只有最後3分,並且不希望有一百萬行的表格。

可以在一個SQL查詢中完成嗎?

希望能幫助和在此先感謝:-)

+0

您可以創建一個觸發器。但是,我可能會創建一個'VIEW'來獲取最後3個點。 – Kermit 2013-02-23 15:15:31

+0

爲什麼一個觀點......是更輕的?不想要很多行?每天有超過10萬用戶獲得5-10次點數。 – Mansa 2013-02-23 15:25:58

+0

你知道'VIEW'是什麼嗎? – Kermit 2013-02-23 15:28:42

回答

1

這是很容易的,如果你添加一個主鍵到表points_history做。

1部分:
使用下面的腳本添加一個名爲points_history_id到表的主鍵:

ALTER TABLE points_history RENAME TO points_history_old; 

CREATE TABLE points_history 
(
    `points_history_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `date` datetime NOT NULL, 
    `fk_player_id` int(11) NOT NULL, 
    `points` int(11) NOT NULL, 
    PRIMARY KEY (`points_history_id`) 
); 

INSERT INTO points_history (date, fk_player_id, points) 
SELECT date, fk_player_id, points 
FROM points_history_old; 

-- Drop table if migration succeeded (up to you) 
-- DROP TABLE points_history_old; 

這需要只運行一次!

第2部分:
現在你可以使用下面的SQL腳本來添加一個新的記錄,並刪除過時:

-- First insert the new record 
INSERT INTO points_history (date,fk_player_id,points) 
VALUES (NOW(),:player,:points); 

-- Create temporary table with records to keep 
CREATE TEMPORARY TABLE to_keep AS 
(
    SELECT points_history_id 
    FROM points_history 
    WHERE fk_player_id = :player 
    ORDER BY date DESC 
    LIMIT 3 
); 

SET SQL_SAFE_UPDATES = 0; 

-- Delete all records not in table to_keep 
DELETE FROM points_history 
WHERE points_history_id NOT IN (SELECT points_history_id FROM to_keep); 

SET SQL_SAFE_UPDATES = 1; 

-- Drop temporary table 
DROP TEMPORARY TABLE to_keep; 

如果您使用的數據庫支持事務,我強烈建議把這個包交易中的腳本。我在MySQL 5.5.29上測試它,它運行良好。

相關問題