从MySQL / PHP中的多个表中删除的正确语法

时间:2014-08-25 18:11:46

标签: php mysql sql mysqli

以下每一行都是单独工作的,但我想将它们合并为一个查询。

$query4="DELETE FROM a WHERE email = '$email'";
$query2="DELETE FROM b WHERE email = '$email'";
$query3="DELETE FROM c WHERE email = '$email'";
$query1="DELETE FROM d WHERE email = '$email'";
$result = mysqli_query($con, $query[1-4, depending]) or die(mysqli_error($con));

我尝试了很多不同的方法。从MySQL文档中,它应该如下:

$query="DELETE FROM a, b, c, d WHERE email = '$email'";
$result = mysqli_query($con, $query) or die(mysqli_error($con));

我也用反引号尝试过,如:

$query="DELETE FROM `a`, `b`, `c`, `d` WHERE email = '$email'";

我尝试将单独的四行连接成一个长的分号分隔的字符串。

除了四条单独的行之外的所有内容都会给我一个SQL语法错误:

  

您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在#< WHERE email =' xxxxxx@yyyyyyyyy.com''在第1行。

我检查了db用户是否具有DELETE权限(当然,他们这样做,因为它在单独运行时工作正常)。

在单独的陈述中这样做相对简单,但我感到有点困惑,为什么它在这一点上不起作用。想要解决这个问题只是为了好奇。

我确实发现mysqli_multi_query()命令...是" ... a,b,c,d ......"部分被mysqli视为单独的查询?

感谢您提供的任何帮助! (请注意,由于它连接正常,我已经省略了数据库连接线。)再次......谢谢!

3 个答案:

答案 0 :(得分:2)

根据OP的要求:

  

" @ Fred-ii-谢谢,这很有用。我连接了单独的语句,而不是尝试编写一个,然后使用mysqli_multi_query。如果您想将此作为答案,我很乐意将其标记出来!"

是的,请使用multi_query

而不是$query1, $query2等。正如手册所示,将其连接起来。

对所有这些使用$query .=,但不要在第一个使用点。

答案 1 :(得分:1)

你可以用

做到这一点
DELETE a, b, c, d 
FROM a 
LEFT JOIN b ON a.email = b.email
LEFT JOIN c ON a.email = c.email
LEFT JOIN d ON a.email = d.email
WHERE a.email = '$email'

USING有第二种语法:

DELETE FROM a, b, c, d 
USING a 
LEFT JOIN b ON a.email = b.email
LEFT JOIN c ON a.email = c.email
LEFT JOIN d ON a.email = d.email
WHERE a.email = '$email'

也应该有用。

注意

要求:要删除的电子邮件必须在表a中至少有一行。

请参阅DELETE语法文档:

  

对于第一个多表语法,只匹配来自的行   删除FROM子句之前列出的表。第二个   多表语法,仅匹配中列出的表中的行   FROM子句(在USING子句之前)被删除。效果是   您可以同时从多个表中删除行并具有   另外只用于搜索的表:

     

删除t1,t2 FROM t1 INNER JOIN t2 INNER JOIN t3   WHERE_1.id = t2.id AND t2.id = t3.id;

答案 2 :(得分:0)

实际上我们无法对MySQL执行“JOIN”删除操作。一个好方法就是将所有指令发送到同一个事务中,如下所示:

DELIMITER $$
DELETE FROM TABLE1 WHERE ...;
DELETE FROM TABLE2 WHERE ...;
DELETE FROM TABLE3 WHERE ...;
DELETE FROM TABLE4 WHERE ...;
...
DELIMITER $$