Mysql语句应该为每个帐户留出最多3行,但相反,它会删除所有行,并只留下最后一行中的3个

问题描述:

我想我的问题有些模糊,但我会进一步解释它。Mysql语句应该为每个帐户留出最多3行,但相反,它会删除所有行,并只留下最后一行中的3个

应该发生什么:比方说,名为John的用户发了2条评论,同时已经有3条评论以他的名字命名。 $sql2应该做的是选择John所做的所有评论,按comment_id排序,并删除John的所有评论,但最后3条评论除外John


我有这样的代码:

$sql1 = "INSERT INTO comments(comment,name) VALUES ('$comment','$name')"; 
mysqli_query($con,$sql1); 

$sql2 = "DELETE FROM comments WHERE comment_id NOT IN (SELECT * FROM (SELECT comment_id FROM comments ORDER BY comment_id desc LIMIT 3) s)"; 
mysqli_query($con,$sql2); 

会发生什么:它删除行的ALL,只是叶子上三行,无论它们的名称


我试过另一个代码:

$sql1 = "INSERT INTO comments(comment,name) VALUES ('$comment','$name')"; 
mysqli_query($con,$sql1); 

$sql2 = "DELETE FROM comments WHERE name NOT IN (SELECT * FROM (SELECT name FROM comments ORDER BY comment_id desc LIMIT 3) s)"; 
mysqli_query($con,$sql2); 

会发生什么:ONLY接受1个用户,如果我试图把Scot如其名,它删除一切,除了在表Scot,它甚至不会仅限于3

+0

请,这只是我练习如何操纵数据库,这是为了教育目的,我无意使用这个在线。此外,是什么让你如此确信,我没有这样做,$ comment = mysqli_real_escape_string($ con,$ rawcomment); – 2015-02-08 05:14:14

+0

在您的第一次尝试中,在声明的最后添加'AND user ='John''。另请阅读[数据库规范化](http://en.wikipedia.org/wiki/Database_normalization)。此外,我会建议使用[PDO](http://php.net/manual/en/book.pdo.php)而不是mysqli,因为PDO实际上可以执行准备好的语句。 – noob 2015-02-08 05:30:21

+0

它似乎不起作用,因为删除语句基本上删除了不属于该组的所有内容,所以如果'Scot'试图插入,删除也将启动删除'John's'记录以及任何其他的记录,因为在删除时,有人表示将保留“Scot's”前三名记录并删除所有内容。 – 2015-02-08 05:56:19

您的查询基本上是说它应该删除所有不匹配子查询的行。由于你的子查询拉入了你想要保留的3行,因此where子句将删除与子查询返回的3不匹配的所有内容。

更有效率的查询将是删除,其中id在您希望删除的行列表中。