【问题标题】:SELECT from and DELETE the same row in one query在一个查询中选择和删除同一行
【发布时间】:2018-07-09 11:32:53
【问题描述】:

目前,我有两个疑问。第一个从一行中选择一列。第二个然后删除该行。由于两个查询都处理同一行,我想知道是否可以同时执行两个查询(以减少代码量)。

我查看了SELECT then immediately DELETE mysql record 并尝试了Whatever Kitchen's answer

这是我之前的代码(效果很好):

$stmt = $con->prepare("SELECT number FROM viewings WHERE username=:user");
$stmt->bindParam(':user', $user);
$stmt->execute();
$row = $stmt->fetch();
$result = $row['number'];
    
$stmt = $con->prepare("DELETE FROM viewings WHERE username=:user");
$stmt->bindParam(':user', $user);
$stmt->execute();
      
echo $result;

这是我尝试回答后的代码:

$stmt = $con->prepare("DELETE FROM viewings WHERE username=:user IN (SELECT number FROM viewings WHERE username=:user LIMIT 1)");
$stmt->bindParam(':user', $user);
$stmt->execute();
$row = $stmt->fetch();
$result = $row['number'];
echo $result;

但是,我收到以下错误:

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[42000]:语法错误或访问冲突:1235 这个版本 的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'' 在 /home//public_html/page.php:47

堆栈跟踪:

0 /home//public_html/page.php(47): PDOStatement->execute()

1 {main} 在第 4 行的 /home//public_html/page.php 中抛出

【问题讨论】:

  • 您不会从该查询中获得内容或viewings
  • 这也不是你使用IN的方式。语法为:WHERE columnName IN ('value1', 'value2', ...).
  • 不能同时选择和删除。您必须使用上面的查询或只编写存储过程
  • 返回使用您的原始代码
  • 返回上一个代码并修复第一个选择:SELECT number FROM viewings WHERE username=:user LIMIT 1 以避免数据库引擎遍历表以搜索其他行。

标签: php mysql pdo


【解决方案1】:

您可以尝试使用EXISTS 条件:

DELETE FROM viewings WHERE EXISTS (SELECT * FROM viewings WHERE username=:user LIMIT 1)

来源:SQL EXISTS condition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多