2013-02-23 6 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

트리거를 만들 수 있습니다. 그러나, 나는 아마도 마지막 3 점을 가져올 VIEW를 생성 할 것입니다. – Kermit

+0

왜보기 ... 가벼운가? 행이 많지 않으십니까? 100.000 명 이상의 사용자가 하루에 5-10 번 점수를받습니다. – Mansa

+0

'VIEW '가 무엇인지 아십니까? – Kermit

답변

1

이 당신이 당신의 테이블 points_history에 기본 키를 추가 할 경우 수행 할 매우 쉽습니다 :-) 사전에 도움과 감사에 대한 기대.

1 부 :이 한 번만 실행해야

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; 

:
를 사용하여 다음 스크립트는 테이블에 points_history_id라는 기본 키를 추가합니다!

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에서 테스트했는데 잘 돌아갑니다.

관련 문제