Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅允许1行时删除最后插入的SQL行_Php_Mysql - Fatal编程技术网

Php 仅允许1行时删除最后插入的SQL行

Php 仅允许1行时删除最后插入的SQL行,php,mysql,Php,Mysql,我想知道为什么我的删除功能不正常 我正在尝试删除SQL行,这是在仅接受1行具有ip地址和用户id且仅接受一行具有ip地址和空白用户id时插入的最后一个SQL行 这是我的密码: DELETE FROM visitor WHERE ip_address NOT IN (SELECT ip_address FROM visitor WHERE ip_address = '".$ipAddress."' AND user_id = '' ORDER

我想知道为什么我的删除功能不正常

我正在尝试删除SQL行,这是在仅接受1行具有ip地址和用户id且仅接受一行具有ip地址和空白用户id时插入的最后一个SQL行

这是我的密码:

DELETE
FROM visitor
WHERE ip_address NOT IN
    (SELECT ip_address
     FROM visitor
     WHERE ip_address = '".$ipAddress."'
         AND user_id = ''
     ORDER BY user_id DESC LIMIT 1)

为什么我的SQL行没有删除?

很简单:因为不允许在子查询中使用要从中删除的表。只需单独运行SELECT查询,并使用结果执行删除

,它明确指出此处不允许:

Incorrectly used table in subquery: Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You can't specify target table 'x' for update in FROM clause" This error occurs in cases such as the following, which attempts to modify a table and select from the same table in the subquery: UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1); You can use a subquery for assignment within an UPDATE statement because subqueries are legal in UPDATE and DELETE statements as well as in SELECT statements. However, you cannot use the same table (in this case, table t1) for both the subquery FROM clause and the update target. 特别是最后一句话很重要:但是,在这种情况下,不能使用同一个表,即表t1用于子查询FROM子句和update目标


有一种很有技巧的方法可以解决这个问题,这很愚蠢,但上次我检查时它起了作用,那就是将您的子查询包装在另一个子查询中,其中x在SELECT id中来自SELECT id FROM tbl。。。。但这在各方面都很糟糕

你能不能不从访问者中删除ip_address=“.$ipAddress.”和user_id=ORDER BY user_id DESC LIMIT1@Fred-我想你的意思是和用户_id@Digzol,我会说我被纠正了-因此,只需从访问者中删除ip_地址限制1?@user3561965:NO。首先执行子查询,获取一行的结果,然后使用从SELECT中获得的数据执行删除。只需进行两次查询,而不是试图将其全部塞进一次查询中。PS:你可能只是容易被注入你没有的代码