2012-01-12 98 views
0

我试图在MySQL数据库中创建一个高分列表,只有3列:id,名称和分数。该表被称为高分。我尝试使用此代码:SQL,通过删除最低值的行来限制总行数

DELETE FROM Highscores WHERE 
Score = (SELECT min(Score) FROM Highscores) 
AND (SELECT count(*) FROM Highscores) > 10; 

但它给这个错误:

#1093 - You can't specify target table 'Highscores' for update in FROM clause 

如何删除该行与最低值,只有当有超过10行?可能有不止一行的最低值,但我只希望删除一行。

回答

0
delete from highscores where id = (select * from (
select id from highscores order by score desc limit 10,1) as t) 

另一种方法只保留10分最大

delete from highscores where id in (select * from (
select id from highscores order by score desc limit 10,18446744073709551615) as t) 
+0

当我尝试去做这些事情时,它会给出错误“The table”高分“不存在”。 – stickyShift 2012-01-13 03:30:56

+0

这是因为你只需要大写高分。不要复制和粘贴。先阅读 – 2013-10-06 05:52:44

0

使用存储过程:

本只运行一次

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 ; 

,这取代了您的查询

CALL Sanitize_Highscores 
+0

这只会删除一个,不检查是否有表中的超过10个值仍。 – Tim 2012-01-12 22:33:42

+0

这并没有解决只有超过10行的问题。 – Matthew 2012-01-12 22:34:03

+0

我正在研究它,当我意识到我已经保存了一个太短的版本(你看到了) - 抱歉,剪切和粘贴错误。 – 2012-01-12 22:41:51

1

我想知道如果你能创造高分的视图。

0

尝试创建一个临时表并在SELECT调用中使用它。