Sql 具有OR条件的多个内部联接的错误结果

Sql 具有OR条件的多个内部联接的错误结果,sql,ruby-on-rails,activerecord,left-join,inner-join,Sql,Ruby On Rails,Activerecord,Left Join,Inner Join,我有三个模型:事件、评论和照片。一个活动既有多条评论,也有多张照片 我的目标是找到在过去24小时内收到新评论和/或照片的所有活动 假设存在两个事件,一个是最近的评论,另一个是最近的照片 如果我使用单个联接单独查询它们,则一切都会按预期进行: Event.joins:comments.wherecomments.created_at>=:today,:today=>Time.now.start_of_day 返回:[] Event.joins:photos.wherephotos.created_

我有三个模型:事件、评论和照片。一个活动既有多条评论,也有多张照片

我的目标是找到在过去24小时内收到新评论和/或照片的所有活动

假设存在两个事件,一个是最近的评论,另一个是最近的照片

如果我使用单个联接单独查询它们,则一切都会按预期进行:

Event.joins:comments.wherecomments.created_at>=:today,:today=>Time.now.start_of_day 返回:[]

Event.joins:photos.wherephotos.created_at>=:today,:today=>Time.now.start_of_day 返回:[]

为什么我将两个联接合并在一起:

事件。加入:评论,:照片 .wherecomments.created_>=:today或photos.created_>=:today,:today=>Time.now.start_of_day 我收到[,]-两次2,但不是1

ARel生成的SQL是

选择事件* 从事件中 内部联接注释 关于comments.event_id=events.id 内部连接照片 在photos.event_id=events.id上 其中comments.created_在>='2013-03-25 23:00:00.000000' 或照片。创建时间>='2013-03-25 23:00:00.000000'
这是一个SQL问题:必须指定左连接而不是内部连接。include将为您提供:

Event.include(:comments, :photos).where(...).uniq

我相信这是因为内在的结合。此查询将仅带来同时包含照片和评论的事件。
您可以尝试在RDBMS上使用LEFT JOIN而不是INNER,并查看两个结果是否都已获取。

可能我误解了您的建议,但添加了。uniq只返回事件2一次,而不是事件1和2?抱歉,我误解了。正如MurifoX所说,你必须做左连接,而不是内部连接。尝试活动。包括:评论,:照片。其中。。。如果是解决方案,我会纠正我的建议。谢谢,LEFT JOIN确实更有效。不过,我对这个解释并不完全肯定。如果两个内部联接只导致行同时匹配照片和注释,为什么单个联接查询每个只返回一个?在这种情况下,带有两个连接的查询应该会产生零结果,而不是两次结果。可能这两个查询有一张照片和一条注释?不,这是让我困惑的部分。如果我加入评论,我会得到事件1。如果我在照片上加入,我将获得活动2。如果我同时参加这两项活动,我会参加第二项活动,第二项活动。哦,我现在就参加了。问题在于手术室。有两条记录符合此条件,但联接排除一条记录并复制结果。在您的情况下,我认为最好使用和,就好像您希望满足这两个条件一样。再次感谢您的持续帮助。这难道不是只能找到同时有匹配评论和照片的事件吗?在我看来,这就是它的样子——使用并导致零匹配。