Php 带限制的MySQL删除

Php 带限制的MySQL删除,php,mysql,Php,Mysql,这看起来很简单,但它失败了。我只想用下面的代码删除除第一行以外的所有行 $sql = "DELETE FROM ".TABLE_PREFIX."news WHERE course_id = $course_id LIMIT 1,18446744073709551615"; $result = mysql_query($sql, $db); 如果我这样做 $sql = "SELECT news_id FROM ".TABLE_PREFIX."news WHERE course_id

这看起来很简单,但它失败了。我只想用下面的代码删除除第一行以外的所有行

$sql    = "DELETE FROM ".TABLE_PREFIX."news WHERE course_id = $course_id LIMIT 1,18446744073709551615";
$result = mysql_query($sql, $db);
如果我这样做

$sql    = "SELECT news_id FROM ".TABLE_PREFIX."news WHERE course_id = $course_id LIMIT 1,18446744073709551615";
$result = mysql_query($sql, $db);
while ($row = mysql_fetch_assoc($result)) {
    echo $row['news_id'] . '<br>';
}
$sql=“从“.TABLE\u PREFIX”中选择新闻\u id=$course\u id LIMIT 118446744073709551615”;
$result=mysql\u查询($sql,$db);
while($row=mysql\u fetch\u assoc($result)){
echo$row['news_id']。
; }

除第一条外,所有的新闻ID都会被回显。当select的同一语句正在工作时,为什么delete语句不工作?

delete语句不工作是因为limit关键字附近的语法不正确…无法执行
limit 118446744073709551615
limit
与一起使用时必须后跟一个数字
DEELTE

参考:

只有在SELECT语句中才能有
LIMIT 118446744073709551615
子句

参考:

或者,您可以查找要删除的第一行的课程id(如果表格设置正确,并且它是表格和自动增量的主键,希望如此),执行以下操作:

$sql = "DELETE FROM ".TABLE_PREFIX."news 
        WHERE course_id >=".COURSE_ID_YOU_WANT_DELETED.";
或者这也行:

$sql = "DELETE FROM ".TABLE_PREFIX."news 
        WHERE course_id !=".COURSE_ID_YOU_WANT.";

您应该找到第一行的id并执行以下操作:

DELETE FROM table WHERE id != id_found
或者查找您必须删除的ID并

DELETE FROM table WHERE id IN (ids_found)

如@Sabashan所说,DELETE语句中的LIMIT只允许一个参数

如果要排除第1行,请使用以下命令:

DELETE FROM tnews WHERE course_id = $course_id 
AND primary_key NOT IN 
(SELECT * FROM (
SELECT primary_key FROM tnews ORDER BY something LIMIT 1 OFFSET 0))
内部选择将拾取要排除的记录。 外部选择解决了无法从要删除的表中选择的问题。
因为内部SELECT被外部SELECT包围,所以MySQL将结果具体化在临时表中,并使用临时表,而不是每次删除都重新运行查询(MySQL不允许这样做)

什么决定了第一行是什么?同样,这不是DELETE语句中LIMIT的正确语法-您只需要为要删除的最大行数包含一个整数:“LIMIT 118446744073709551615”部分应该跳过第一行,然后删除所有其他行。我从这里得到了这个想法:无论你做什么,我建议定义
orderbynews\u id ASC
,这样它总是按照你认为的排序方式进行排序。我从来没有尝试过这样删除,所以我无法提供太多帮助。您可以选择第一个新闻id,然后删除
其中course\u id=$course\u id和news\u id!=$新闻id
@JohnBovey-这个问题是关于选择,而不是删除。这两个语法相似,但不完全相同。示例不等于OP的代码。除第一行外,也不排除所有行。我可以通过首先选择“first”news_id看到这一点,正如我在上面的评论中所描述的。我会推迟选择这个作为答案,直到其他人有机会回答。谢谢经过一些调整后,我让你的想法生效了。如果有人感兴趣,我最后使用的代码是
$sql=“SELECT news\u id FROM.”TABLE\u PREFIX.“news WHERE course\u id=$course\u id ORDER BY news\u id asc LIMIT 1”;$result=mysql\u查询($sql,$db);$row=mysql\u fetch\u assoc($result);$sql=“删除自“.TABLE_PREFIX.”新闻,其中course_id=$course_id和news_id!=””。“$row['news_id']。”;$result=mysql\u查询($sql,$db)我正在尝试实现这个,但它不起作用。我有
$sql=“DELETE FROM.”TABLE_PREFIX.“其中course_id=$course_id和primary_key不在其中的新闻(SELECT*FROM(SELECT primary_key FROM..TABLE_PREFIX.“新闻顺序按新闻_id限制1偏移量0))”;$result=mysql\u查询($sql,$db)想法?您需要将“主键”占位符替换为您pk的任何字段名。如果真的有这样一个关键词,我会按照惯例用大写字母写。