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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top