自引用时删除数据table

Delete data when self-referencing table

我 运行 在尝试清理 MySQL table 中的数据时遇到了问题。问题是我们需要在子查询中使用table来识别需要删除的内容。

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (
  SELECT person.person_ref
  FROM person
  JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
  WHERE dates.date < CURDATE()
)

Subquery 给出所有日期早于今天的人。事件引用列表是我们要删除的事件列表,排除 event_ref = 14

将查询视为 SELECT returns 我们想要删除的所有内容,但是 MySQL 在尝试使用删除时抱怨。

由于清理是一次性事件,因此我真的不想费尽心思创建一个视图来引用上述查询

您可以使用子查询:

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (SELECT person_ref FROM (
  SELECT person.person_ref
  FROM person
  JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
  WHERE dates.date < CURDATE()) sub
)

您可以对相同的子查询使用内部联接 table

    DELETE dates FROM dates
    INNER JOIN (
          SELECT person.person_ref
      FROM person
      JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
      WHERE dates.date < CURDATE()) sub
    ) t on t.person_ref = dates. person_ref
    AND  event_ref IN (*list of event_refs*)

首先让我们缩短查询。你可以在这里去掉 person table;你没有用它做什么。

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
  SELECT person_ref
  FROM dates 
  WHERE event_ref = 14 AND date < CURDATE()
);

现在 MySQL 不喜欢直接访问要从中删除的 table。在 MySQL 中,您必须将 table 包装在一个伪子查询中:

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
  SELECT person_ref
  FROM (SELECT * FROM dates) d
  WHERE event_ref = 14 AND date < CURDATE()
);