0

新しい行がその特定のユーザーの4行である場合、else / ifなしでスクリプトを作成することは可能ですか?ユーザーの最も古い行を削除しますか?

points_historyというテーブルがあります。フィールドは次のとおりです。

date(datetime)、fk_player_id(int)、points(int)

これが私の挿入物です:

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

この理由は、プレーヤーの履歴に戻ってポイントを確認できるようにしたいのですが、最後の3ポイントだけで、数百万行のテーブルは必要ありません。

1つのSQLクエリで実行できますか?

事前に助けと感謝を願っています:-)

4

1 に答える 1

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でテストしましたが、正常に動作します。

于 2013-02-23T16:47:57.017 に答える