SQL und begrenzte die Gesamtzeilen durch Löschen des mit dem niedrigsten Wert
-
27-10-2019 - |
Frage
Ich versuche, in einer MySQL -Datenbank eine High -Score -Liste zu erstellen, nur 3 Spalten: ID, Name und Punktzahl. Die Tabelle wird als HighScores bezeichnet. Ich habe versucht, diesen Code zu verwenden:
DELETE FROM Highscores WHERE
Score = (SELECT min(Score) FROM Highscores)
AND (SELECT count(*) FROM Highscores) > 10;
Aber es gibt diesen Fehler:
#1093 - You can't specify target table 'Highscores' for update in FROM clause
Wie kann ich die Zeile mit dem niedrigsten Wert löschen, nur wenn es mehr als 10 Zeilen gibt? Es könnte möglicherweise mehr als eine Zeile mit dem niedrigsten Wert geben, aber ich möchte nur, dass eine gelöscht wird.
Lösung
delete from highscores where id = (select * from (
select id from highscores order by score desc limit 10,1) as t)
Ein anderer Ansatz, um nur 10 größte Punktzahlen zu führen
delete from highscores where id in (select * from (
select id from highscores order by score desc limit 10,18446744073709551615) as t)
Andere Tipps
Ich frage mich, ob Sie nur eine Aussicht mit hohen Punktzahlen schaffen könnten.
Versuchen Sie, eine temporäre Tabelle zu erstellen und verwenden Sie diese in Ihren Auswahlanrufen.
Verwenden Sie ein gespeichertes Verfahren:
Dies läuft nur einmal
DELIMITER $$
DROP PROCEDURE IF EXISTS `Sanitize_Highscores`$$
CREATE PROCEDURE `Sanitize_Highscores`() READS SQL DATA
BEGIN
DECLARE numrows int DEFAULT 0;
SELECT COUNT(*) INTO numrows FROM Highscores;
if numrows>10 THEN
DELETE FROM Highscores ORDER BY Score LIMIT 1;
END IF;
END$$
DELIMITER ;
Und dies ersetzt Ihre Anfrage
CALL Sanitize_Highscores