如何从 SELECT 查询结果中删除条目 mysql?

How to delete entries from a SELECT query result in mysql?

我有以下 SQL 查询:

SELECT wp_posts.* , wicl_translations.*
FROM wp_posts wp_posts join wp_icl_translations wicl_translations
ON (wicl_translations.element_id = wp_posts.ID)
WHERE (wicl_translations.language_code = 'es-es'
AND wicl_translations.element_type ='post_product'
AND wp_posts.post_type = 'product' ) GROUP BY wp_posts.ID

这 returns 我需要从我的数据库中删除的所有结果,所以我尝试了几个 DELETE 查询,但所有查询都出现语法错误。

示例:

DELETE FROM wp_posts
WHERE (



SELECT wp_posts.* , wicl_translations.*
FROM wp_posts wp_posts join wp_icl_translations wicl_translations
ON (wicl_translations.element_id = wp_posts.ID)
WHERE (wicl_translations.language_code = 'pt-pt'
AND wicl_translations.element_type ='post_product'
AND wp_posts.post_type = 'product' ) GROUP BY wp_posts.ID
)
);

也试过这个:

DELETE FROM wp_posts WHERE wp_posts.ID = ANY IN (

SELECT wp_posts.ID, wicl_translations.*
FROM wp_posts wp_posts join wp_icl_translations wicl_translations
ON (wicl_translations.element_id = wp_posts.ID)
WHERE (wicl_translations.language_code = 'es-es'
AND wicl_translations.element_type ='post_product'
AND wp_posts.post_type = 'product' ) GROUP BY wp_posts.ID
)

这是一个复杂的聚合查询,我缺乏 mysql 知识来正确编写删除这些结果的规则。

我该如何解决这个问题?

谢谢

你走在正确的轨道上!

您只是错过了正确的 WHERE 条件:

DELETE FROM wp_posts WHERE wp_posts.ids IN (...)

确保结果只有一列,您在从目标表中删除数据时应参考该列。删除查询将等于您需要从 ie.

中删除的表的数量
DELETE FROM table_1 where common_column in (YOUR_SELECT_QUERY);
DELETE FROM table_2 where common_column in (YOUR_SELECT_QUERY);
DELETE FROM table_3 where common_column in (YOUR_SELECT_QUERY);
DELETE FROM table_nth where common_column in (YOUR_SELECT_QUERY);

您的 select 查询类似于,

SELECT GROUP_CONCAT(temp_tbl.ID) FROM (SELECT wp_posts.* , wicl_translations.*
FROM wp_posts wp_posts join wp_icl_translations wicl_translations
ON (wicl_translations.element_id = wp_posts.ID)
WHERE (wicl_translations.language_code = 'es-es'
AND wicl_translations.element_type ='post_product'
AND wp_posts.post_type = 'product' ) GROUP BY wp_posts.ID) AS temp_tbl

如果我们有一个复杂的查询,return是我们要删除的 wp_posts 行的 id 值(假设 id 是主键或 table) 中一行的唯一键...作为示例

SELECT p.id
  FROM wp_posts p
  JOIN wp_icl_translations t
    ON t.element_id = p.id 
 WHERE t.language_code = 'es-es'
   AND t.element_type  = 'post_product'
   AND p.post_type     = 'product'
 GROUP
    BY p.id
    

然后我们可以将该查询用作内联视图。我们将查询包裹在括号中,并在另一个查询的 FROM 子句中引用它。 MySQL 要求我们为内联视图分配一个别名(或 derived table in the MySQL 白话)。

我们可以将内联视图的结果连接回我们要从中删除行的 table。我们先写这个SELECT语句

SELECT r.*
  FROM ( -- inline view
         SELECT p.id
           FROM wp_posts p
           JOIN wp_icl_translations t
             ON t.element_id = p.id 
          WHERE t.language_code = 'es-es'
            AND t.element_type  = 'post_product'
            AND p.post_type     = 'product'
          GROUP
             BY p.id
       ) q
  JOIN wp_posts r
    ON r.id = q.id
    

到 return 要删除的行集。我们可以验证这是预期的集合,或者将行集合插入(创建 table 为)到备份中...

一旦我们确信 SELECT 正在 returning 我们要删除的行,我们可以通过将 SELECT 关键字替换为 DELETE 将其转换为 DELETE 语句。

DELETE r.*
  FROM ( -- inline view
         SELECT p.id
           FROM wp_posts p
           JOIN wp_icl_translations t
             ON t.element_id = p.id 
          WHERE t.language_code = 'es-es'
            AND t.element_type  = 'post_product'
            AND p.post_type     = 'product'
          GROUP
             BY p.id
       ) q
  JOIN wp_posts r
    ON r.id = q.id