gpt4 book ai didi

ruby-on-rails - 试图删除数据库中的重复条目但得到 nil id

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

我正在使用 Rails find_by_sql 查询来查找重复的条目,但我很难删除它们,因为该查询返回一个 ID 列为 nil 的数组。

LogEntry.find_by_sql("SELECT date, athlete_id, count(*) as qty FROM log_entries GROUP BY date, athlete_id HAVING count(*)> 1")

这将返回以下数组:

[#<LogEntry id: nil, date: "2016-06-12", athlete_id: 49>, #<LogEntry id: nil, date: "2015-09-05", athlete_id: nil>, #<LogEntry id: nil, date: "2015-09-06", athlete_id: nil>, #<LogEntry id: nil, date: "2019-05-02", athlete_id: nil>]

当我尝试添加 .each(&:destroy) 时,它无法销毁它,因为如您所见,id 被列为 nil。我不明白的是这怎么可能?这些条目应该能够在没有 ID 的情况下存在于表中。我的sql查询有问题吗?

谢谢!

最佳答案

在@engineersmnky 的评论后更新了答案(谢谢,错过了分组)。

为了删除重复项,您必须获取重复行的 ID。对于每个副本,您需要 N - 1 个 ID,因为应该留下一个。

要获取具有多个(因此具有重复)的每个组的所有 ID:

SELECT array_agg(id) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1

让我们省略每组中的第一个 ID:

SELECT (array_agg(id))[2:] FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1

接下来,我们需要解除它们的嵌套,以便我们得到一个仅包含我们要删除的 ID 的列表:

SELECT unnest((array_agg(id))[2:]) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1

现在,为了在 Rails 中加载这些,一个简单的 .where(..) 就足够了,其中 ID 在上面构造的结果集中:

LogEntry.where('id IN (SELECT unnest((array_agg(id))[2:]) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1)')

原答案:

您的 SELECT 没有选择 id。将 id 添加到您的查询中,它应该可以工作:

LogEntry.find_by_sql("SELECT id, date, athlete_id, count(*) as qty FROM log_entries GROUP BY date, athlete_id HAVING count(*)> 1")

关于ruby-on-rails - 试图删除数据库中的重复条目但得到 nil id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56121952/

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