【问题标题】:How to delete entries from a SELECT query result in mysql?如何从 mysql 中的 SELECT 查询结果中删除条目?
【发布时间】:2020-07-21 18:51:51
【问题描述】:

我有以下 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

这会返回我需要从数据库中删除的所有结果,因此我尝试了几个 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 知识来正确编写删除这些结果的规则。

我该如何处理?

谢谢

【问题讨论】:

  • 嗨有趣,也许这个语法会很有趣stackoverflow.com/questions/4562787/…
  • @IronMan 谢谢,我实际上也尝试过,但我可能做错了什么,无法找出正确的语法。这是一个很长的查询!
  • 好吧,你的 where 子句没有任何意义,因为复杂的子查询只返回一堆记录,但没有关于应该删除哪些记录的标准
  • @Shadow 我想我已经说得很清楚了,我想删除我的所有查询结果?
  • 是的,你对我和其他人说得很清楚,但对 mysql 没有。 where 子句需要为每条记录计算一个真/假结果,否则 mysql 将不知道要包含哪些行。

标签: mysql sql-delete


【解决方案1】:

如果我们有一个复杂的查询,它返回我们要删除的wp_posts 中行的id 值(假设id 是表中行的主键或唯一键).. . 举个例子

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 要求我们为内联视图(或 MySQL 白话中的派生表)分配一个别名。

我们可以将内联视图的结果连接回我们要从中删除行的表。我们先写一个 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
    

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

一旦我们确信 SELECT 正在返回我们想要删除的行,我们可以通过将 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

【讨论】:

  • 非常感谢,我之前已经对这个主题进行了一些研究,这是迄今为止我见过的关于如何管理此类情况的最佳实际示例!能够插入行和备份的额外好处非常出色!
  • (这不会备份被外键约束的 CASCADE 删除的行。这是额外的步骤,但仍然基于 SELECT。我总是一次性写一个首先将 DELETE 语句作为 SELECT 语句,然后我可以验证要删除的行集。对于简单的条件可能不那么重要,但更复杂的 WHERE 和 JOIN 条件...我宁愿在 SELECT 中找到问题而不是处理无意中删除不应该删除的行的后果。
【解决方案2】:

你在正确的轨道上!

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

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

【讨论】:

  • 谢谢,但遗憾的是这不起作用:查询中的错误(1241):操作数应包含 1 列在开头添加后:从 wp_posts WHERE wp_posts.ID IN (跨度>
  • 是的,当然很抱歉。在您的子查询中,您必须仅选择 wp_posts.ids : SELECT wp_posts.ids ... GROUP BY wp_posts.ids
【解决方案3】:

确保在从目标表中删除数据时,结果中只有一列供您参考。删除查询将等于您需要从 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 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

【讨论】:

  • Tyvm Alberto,这似乎更接近肯定,但不知何故它一次只影响一排!我添加了这个条件:DELETE FROM wp_posts where ID in (yourqueryhere);它运行没有错误,但每次只影响 1 行?
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
相关资源
最近更新 更多