简体   繁体   English

使用内部联接超过3个表的SQL删除

[英]Sql delete using inner join more than 3 tables

I run this sql statement to delete from database using inner join, but i get too many errors 我运行此sql语句以使用内部联接从数据库中删除,但是出现太多错误

Error 错误

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 致命错误:消息为“ SQLSTATE [42000]”的未捕获的异常“ PDOException”:语法错误或访问冲突:1064 SQL语法有错误; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INNER JOIN ipaddress_likes_map ON ipaddress_likes_map.postat = blog_post.BID INN' at line 3' in C:\\xampp\\htdocs\\codejail.net_inc\\dbcontroller.php:57 Stack trace: #0 C:\\xampp\\htdocs\\codejail.net_inc\\dbcontroller.php(57): PDOStatement->execute() #1 C:\\xampp\\htdocs\\codejail.net\\user\\deleteaccount.php(88): DBController->execute() #2 {main} thrown in C:\\xampp\\htdocs\\codejail.net_inc\\dbcontroller.php on line 57 检查与您的MariaDB服务器版本对应的手册以获取正确的语法,以在“ INNER JOIN ipaddress_likes_map ON ipaddress_likes_map.postat = blog_post.BID INN”在C:\\ xampp \\ htdocs \\ codejail.net_inc \\ dbcontroller.php的第3行使用:57堆栈跟踪:#0 C:\\ xampp \\ htdocs \\ codejail.net_inc \\ dbcontroller.php(57):PDOStatement-> execute()#1 C:\\ xampp \\ htdocs \\ codejail.net \\ user \\ deleteaccount.php( 88):第57行上的C:\\ xampp \\ htdocs \\ codejail.net_inc \\ dbcontroller.php中抛出了DBController-> execute()#2 {main}

here is my code 这是我的代码

<?php
   if(isset($_POST['delete'])){
     $pass = $_POST['pasyske'];
     $userkey = $_POST['username'];
     $db_delete = new DBController();
     $db_delete->prepare("DELETE
FROM blog_post
INNER JOIN ipaddress_likes_map ON ipaddress_likes_map.postat = blog_post.BID
INNER JOIN flagpost ON flagpost.postId = blog_post.BID
INNER JOIN postviewmap ON postviewmap.viewpostId = blog_post.BID
INNER JOIN replys ON replys.rid = blog_post.BID
INNER JOIN votepoint_map ON votepoint_map.postlike_id = blog_post.BID
WHERE blog_post.UserName = :alluserpost");
     $db_delete->bind(":alluserpost", $userkey);
     //$db_delete->bind(":password", $encrypt_password);
     $db_delete->execute();
     $pdeleted = $db_delete->getAll(); 
     $db_delete->free();

    if($pdeleted){
        print_r($pdeleted);
    }

   }?>

I'm sure my db controller is okay because when i run single delete statement it work very fine 我确定我的数据库控制器是可以的,因为当我运行单个delete语句时,它可以很好地工作

After DELETE you should tell from what table to delete rows. 删除后,您应该告诉您从哪个表中删除行。 Try this query: 试试这个查询:

$db_delete->prepare("DELETE blog_post 
FROM blog_post
INNER JOIN ipaddress_likes_map ON ipaddress_likes_map.postat = blog_post.BID
INNER JOIN flagpost ON flagpost.postId = blog_post.BID
INNER JOIN postviewmap ON postviewmap.viewpostId = blog_post.BID
INNER JOIN replys ON replys.rid = blog_post.BID
INNER JOIN votepoint_map ON votepoint_map.postlike_id = blog_post.BID
WHERE blog_post.UserName = :alluserpost");

Give each table an alias and reference it right after the word DELETE . 给每个表起一个别名,并在单词DELETE之后立即引用它。 Also, use LEFT JOIN instead of INNER JOIN because I'm guessing you still want the deletes to work event if some of the joined tables don't have matching rows. 另外,使用LEFT JOIN而不是INNER JOIN因为我猜想如果某些联接表没有匹配的行,您仍然希望执行删除操作事件。

db_delete->prepare("DELETE bp, i, f, p, r, v
FROM blog_post AS bp
LEFT JOIN ipaddress_likes_map AS i ON i.postat = bp.BID
LEFT JOIN flagpost AS f ON f.postId = bp.BID
LEFT JOIN postviewmap AS p ON p.viewpostId = bp.BID
LEFT JOIN replys AS r ON r.rid = bp.BID
LEFT JOIN votepoint_map AS v ON v.postlike_id = bp.BID
WHERE bp.UserName = :alluserpost");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM