2013-07-05 163 views
3

这看起来很简单,但是它失败了。我想要做的就是使用下面的代码删除除第一行以外的所有内容。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 = $course_id LIMIT 1,18446744073709551615"; 
$result = mysql_query($sql, $db); 
while ($row = mysql_fetch_assoc($result)) { 
    echo $row['news_id'] . '<br>'; 
} 

所有news_ids都回荡除了第一个。为什么删除语句不是工作时选择相同的语句工作?

+1

什么决定了第一行是什么? – ApplePie

+0

另外,在DELETE语句中,这不是正确的LIMIT语法 - 您只需要包含一个用于删除最大行数的整数:http://dev.mysql.com/doc/refman/5.0/en/delete .html – andrewsi

+0

“LIMIT 1,18446744073709551615”部分应该是跳过第一行,然后删除其他所有内容。我从这里得到了这个主意:http://stackoverflow.com/questions/2827029/mysql-skip-first-10-results – gtilflm

回答

1

因为限制关键字附近的不正确的语法的DELETE语句不工作......你不能这样做LIMIT 1,18446744073709551615 ... LIMIT必须跟一个数字当用于DEELTE

参考:DELETE MYSQL

只有在SELECT语句能不能让LIMIT 1,18446744073709551615条款

参考:SELECT MYSQL

什你可以做的另一种方法是找到你想要删除的第一行的course_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."; 
+0

这些示例不等于OP的代码。而且也不排除除第一行之外的所有内容。 – Johan

+0

我可以通过首先选择“第一个”news_id来看到这个工作,正如我在上面的评论中所述。我会暂缓选择这个答案,直到其他人有机会回复。谢谢! – gtilflm

+0

@Johan这不是怎么回事? –

0

你应该在第一行的ID,做一个

DELETE FROM table WHERE id != id_found 

或找到你要删除的ID和

DELETE FROM table WHERE id IN (ids_found) 
4

赞@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不允许)。

+0

我试图实现这一点,但它不工作。我有 '$ sql =“DELETE FROM”.TABLE_PREFIX。“news WHERE course_id = $ course_id AND primary_key NOT IN(SELECT * FROM(SELECT primary_key FROM”.TABLE_PREFIX。“news ORDER BY news_id LIMIT 1 OFFSET 0))” ; \t $ result = mysql_query($ sql,$ db);' 想法? – gtilflm

+0

您需要将您的pk包含的任何字段名称替换为'primary_key'占位符。如果真的有这样一个关键字,我会按照惯例将它写成大写字母。 – Johan