当前位置: 首页 > 面试题库 >

查找所有子记录都具有给定值的所有父记录(而不只是某些子记录)

薛坚
2023-03-14
问题内容

一个活动有很多参与者。参与者的字段为“状态”。

class Event < ActiveRecord::Base
  has_many :participants
end

class Participant < ActiveRecord::Base
  belongs_to :event
end

我需要找到除以下事件以外的所有事件:每个参与者的状态都为“出席”的事件。

我可以找到带有以下AR代码的某些参与者处于“呈现”状态的所有事件:

Event.joins(:participants).where
 .not(participants: {status: 'present'})
  .select("events.id, count(*)")
   .group("participants.event_id")
    .having("count(*) > 0")

这样就创建了SQL:

SELECT events.id, participants.status as status, count(*) 
FROM `events` INNER JOIN `participants` 
ON `participants`.`event_id` = `events`.`id` 
WHERE (`participants`.`status` != 'present') 
GROUP BY participants.event_id HAVING count(*) > 0

几乎 可行。问题是,如果参与者的某行(在范围内
@participant.event_id)的状态为“离开”,则该事件仍将被获取,因为至少某些同级记录的状态与其他状态相同而不是“现在”。

我需要确保我正在过滤所有事件记录, 所有 参与者的状态均为“出席”。

我愿意接受ActiveRecord或SQL解决方案。


问题答案:

如果我做对了,您的问题可以归类为关系分裂。基本上有两种方法可以解决此问题:

1a)全部x:p(x)

在SQL中必须将其转换为:

1b)不存在x:不存在p(x)

对于您的问题,可能是这样的:

SELECT e.* 
FROM events e
WHERE NOT EXISTS (
    SELECT 1 
    FROM PARTICIPANTS p
    WHERE p.status <> 'present'
      AND p.event_id = e.event_id
)

即,任何不存在参与者的给定事件,使得状态!=’present’

这样做的另一种主要方法是将参与者的数量与具有当前状态的参与者的数量进行比较

SELECT e.id 
FROM events e
JOIN participants p 
    ON p.event_id = e.id 
GROUP BY e.event_id 
HAVING count(*) = count( CASE WHEN p.status = 'present' then 1 end )

两种解决方案都未经测试,所以那里可能有错误,但这应该可以帮助您入门



 类似资料:
  • 问题内容: 如何记录django应用程序执行的所有SQL查询? 我想记录所有内容,包括来自管理站点的SQL。我看到了这个问题和一个常见问题解答,但是我仍然不知道应该把它放在哪里 将所有内容记录到一个文件? 所以我的问题是-我应该怎么做才能拥有一个记录所有SQL语句的文件(例如all-sql.log)? 问题答案: 也许看看https://github.com/django-debug-toolba

  • 问题内容: 假设我有两个表,“父母”和“孩子”。父子关系是一个多对多关系,可通过标准的交叉引用表来实现。 我想查找使用SQL(特别是MS SQL Server的T-SQL; 2005语法可以接受)的给定子集的所有成员所引用的所有Parent记录。 例如,假设我有: List item Parent Alice Parent Bob Child Charlie references Alice, B

  • 问题内容: 我的数据库表中具有以下格式的数据: 该列将来自该列的数据作为父记录。带有值的表示根项目。我需要编写查询以按以下顺序获取数据: 我需要得到根记录(与记录为0),然后是所有和这根记录,然后获得下根的记录,然后和在这个根记录等等。 问题答案: 我在这里提出的解决方案使用了物化路径的概念。以下是使用样本数据的实例化路径的示例。我希望它可以帮助您理解物化路径的概念: 每个节点都有一个实例化路径,

  • 问题内容: 我有一张下表 我想选择所有item_id,其中表中具有该item_id的每条记录的状态均为A。 例如,如果记录是这样的: 那么我唯一会回来的item_id是2。 问题答案:

  • 问题内容: 我有一个这样的表: 我正在尝试删除具有3个以上具有相同ID的名称的记录,但要删除所有记录。因此,我试图得到这样的东西: 我不了解如何编写此查询。我已经达到了保留一个记录但没有记录阈值的程度: 给我: 有什么建议?哦,对了,我不在乎合并时会保留哪些记录。 问题答案: 您可以使用CTE做到这一点