gpt4 book ai didi

mysql - 查找不在连接中的记录——高效

转载 作者:行者123 更新时间:2023-11-29 05:37:03 25 4
gpt4 key购买 nike

这个问题我已经看过几次了,但所有的答案都依赖于小数据集或有限的关联,所以这里再说一遍。

我有一个 has_many_through 关系

class ModelA
has_many :model_c, :through => :model_b
has_many :model_b

class ModelB
belongs_to :model_a
belongs_to :model_b

class ModelC
has_many :model_a, :through => :model_b
has_many :model_b

我需要清理“孤立的”模型 B 和模型 C,其中模型 A 已被删除。所以我需要找到并删除没有模型 A 的模型 B,然后删除没有模型 B 的模型 C。

我们在删除模型 A 时没有这样做,因为一个模型 A 可以与数以万计的模型 C 相关联,而且它花费的时间太长了——我们使用 dependent destroy with a guard block 也被触发了许多查询,花了太长时间。我们计划改为现在每晚进行一次清理工作。

因此,我需要查找并删除所有其 model_a 列包含现在不存在的模型 A 的 ID 的模型 B,然后删除它们。

到目前为止,我发现的解决方案对我不起作用(因为在给定时间我们可能有成百上千的孤儿):- 从 ModelA.id 和 ModelB.model_a 加载所有 id 并进行设置差异- 从 ModelA.id 加载所有 id 并传递给模型 B 上的“NOT IN”查询- 从模型 C 逐条记录检查

在这一点上,我认为我需要一个直接的 SQL 解决方案(我很满意),但我不太确定我在寻找什么。

(数据库是MySQL)

最佳答案

我还没有测试过它,但我相信如果理解它会起作用 MySQL Multiple-table Delete Syntax

DELETE 
ModelC,
ModelB
FROM ModelC
LEFT JOIN ModelB
ON ModelC.BID = ModelB.BID
LEFT JOIN ModelA
ON ModelB.AID = ModelA.AID
WHERE
ModelB.BID is NULL
OR ModelA.AID IS NULL

关于mysql - 查找不在连接中的记录——高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9812041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com