0

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    |                |
+--------------------------+--------------+------+-----+---------+----------------+

OBJECTSテーブル

+----------------------------+-------------+------+-----+---------+----------------+
| 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 pINNERJOINオブジェクトの近くで使用する正しい構文を確認してください。ASoONp.page_id = o.page_id 1行目のWHER']]

PDOプレースホルダーの値の例:

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

これはすべて有効であり、問​​題が発生している場所ではないと確信しています。

クエリにいくつか欠けているのではないかと疑ったり、疑ったりします。何か提案がありますか?

4

1 に答える 1

2

内部結合のUPDATEまたはDELETEの場合、実際に削除するテーブルを明示的に指定する必要があります。そうしないと、パーサーは意味を認識できません。削除するテーブルを1つ以上選択できます。あなたの場合、ページのエイリアスである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がDELETEpになりました

于 2012-05-21T04:04:22.963 に答える