2

私はmysqlでそのようなコマンドを実行しようとしています:

DELETE FROM product_description, product, product_to_store, url_alias WHERE
product_description.name LIKE '%|%' AND product.product_id = 
product_description.product_id AND product_to_store.product_id = 
product_description.product_id AND url_alias.query = 
CONCAT('product_id=',product_description.product_id)

ただし、エラーが発生します。

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your  MySQL server version for the right syntax to use near 'WHERE product_description.name LIKE '%|%' AND product.product_id = product_descr' at line 1

'DELETE'を'SELECT*'に置き換えると、クエリは魅力のように機能します。

mysqlドキュメントによると

現在、サブクエリでテーブルから削除して同じテーブルから選択することはできません。

だから今、私はPHPを使わずにそのようなクエリを実行する方法がわからないままになっています

編集済み

うまくいった私の最後のクエリ:

DELETE product_description, product, product_to_store, url_alias 
FROM product_description, product, product_to_store, url_alias 
  WHERE product_description.name LIKE '%|%' AND product.product_id = 
  product_description.product_id AND product_to_store.product_id = 
  product_description.product_id AND url_alias.query = 
  CONCAT('product_id=',product_description.product_id)

したがって、ヒントは、JWが書いたように、DELETEの直後に4つのテーブル名をすべて追加して機能させることでした。

4

2 に答える 2

4

削除を実行する場所を指定する必要があります。以下のこの例では、レコードがテーブルで削除されますproduct_description

DELETE product_description
FROM product_description, product, product_to_store, url_alias 
WHERE product_description.name LIKE '%|%' AND product.product_id = 
      product_description.product_id AND product_to_store.product_id = 
      product_description.product_id AND url_alias.query = 
      CONCAT('product_id=',product_description.product_id)

またはANSI SQL-92フォーマットを使用

DELETE  product_description
FROM    product_description
        INNER JOIN product 
            ON product.product_id = product_description.product_id
        INNER JOIN product_to_store 
            ON product_to_store.product_id = product_description.product_id
        INNER JOIN url_alias 
            ON url_alias.query = CONCAT('product_id=',product_description.product_id)
WHERE   product_description.name LIKE '%|%'
于 2013-01-11T09:18:22.060 に答える
1

削除構文は次のとおりです。

DELETE FROM table_name [WHERE Clause]  

FROM句で複数のtable_namesを指定することはできません(JOINおよびUSING句なし)。

DELETE table_name FROM table_name
INNER JOIN ....

また

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition]

参照:13.2.2。DELETE構文
そしてJW氏はすでにあなたに答えを与えました

使用例

DELETE  
FROM    `product_description`, 
        `product`, 
        `product_to_store`, 
        `url_alias`

USING  `product_description`
        INNER JOIN `product` 
         ON `product`.`product_id` = `product_description`.`product_id`
        INNER JOIN `product_to_store` 
         ON `product_to_store`.`product_id` = `product_description`.`product_id`
        INNER JOIN `url_alias` 
         ON `url_alias`.`query` =
               CONCAT('product_id=',`product_description`.`product_id`)
WHERE   `product_description`.`name` LIKE '%|%'  

補足: ユーザー定義の識別子には常に( `)を使用してください。

于 2013-01-11T09:25:30.523 に答える