在内部连接表中执行删除

时间:2012-05-21 03:59:57

标签: php mysql pdo sql-delete

我想删除 PAGES 表格中的条目。删除后,它将级联到 OBJECTS 表。不用担心,如果我使用简单的DELETE删除条目,它就可以了。但是,我需要指定一些条件:

PAGES

+--------------------------+--------------+------+-----+---------+----------------+
| Field                    | Type         | Null | Key | Default | Extra          |
+--------------------------+--------------+------+-----+---------+----------------+
| page_id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
| users_id                 | int(11)      | NO   | MUL | NULL    |                |
| page_value               | varchar(20)  | NO   | UNI | NULL    |                |
+--------------------------+--------------+------+-----+---------+----------------+

对象

+----------------------------+-------------+------+-----+---------+----------------+
| Field                      | Type        | Null | Key | Default | Extra          |
+----------------------------+-------------+------+-----+---------+----------------+
| objects_id                 | int(11)     | NO   | PRI | NULL    | auto_increment |
| page_id                    | int(11)     | NO   | MUL | NULL    |                |
| objects_name               | varchar(50) | NO   |     | NULL    |                |
| objects_avail              | varchar(20) | NO   |     | NULL    |                |
+----------------------------+-------------+------+-----+---------+----------------+

如果objects_avail == "ALL",我不得在级联删除中包含该条目。我提出了这个SQL查询但是出现了错误:

$query = "
    DELETE FROM pages AS p 
    INNER JOIN objects AS o ON p.page_id = o.page_id 
    WHERE p.page_id = ? 
      AND p.users_id = ? 
      AND p.page_value = ? 
      AND o.objects_avail != ?";

抛出的错误:

  

[“42000”,1064,“您的SQL语法有错误;请查看手册   对应于您的MySQL服务器版本,以获得正确的语法   在'AS p INNER JOIN对象附近使用,请在p.page_id = o.page_id WHER'   在第1行“]

PDO占位符的示例值:

$params = array(81,5,"main page","ALL");

所有这些都是有效的,我确信这不是问题所在。

我怀疑或预先确定我在查询中遗漏了一些内容,有什么建议吗?

1 个答案:

答案 0 :(得分:2)

对于内部联接UPDATE或DELETE,您需要明确指定实际要删除哪些表,否则解析器将不知道您的意思。您可以选择一个或多个要删除的表。在您的情况下,删除页面的别名p是有意义的。

DELETE p
FROM pages AS p
INNER JOIN objects AS o ON p.page_id = o.page_id
WHERE
    p.page_id = ? AND
    p.users_id = ? AND
    p.page_value = ? AND
    o.objects_avail != ?

我改变的唯一一行是DELETE成为DELETE p