【问题标题】:Query using joins (many m:n relations)使用连接查询(许多 m:n 关系)
【发布时间】:2012-09-19 11:39:12
【问题描述】:

我必须使用 Rails 的活动记录或 sql (sqlite) 执行以下查询。

让我们从模型的描述开始。

  • 用户 1:n 兴趣
  • 兴趣 m:n 类别
  • 兴趣 m:n 位置
  • 事件 m:n 类别
  • 事件 m:n 地点

m:n 关系正在通过具有模式interests_categories、events_categories 等的第三个表来实现。

我有用户并且这些用户有兴趣(类别 -> 例如运动、音乐和他喜欢的位置)。事件被标记为位置和类别。

现在我想列出所有可能适合特定活动的用户。例如,如果在纽约市举办了一项活动,并且有一些体育活动,我想根据地点和类别获取可能对此活动感兴趣的用户列表。

我想在单个数据库访问中完成此操作,而不是多个。 在 ActiveRecord 或 sql 中会是什么样子? (更有效的方法将是首选) 我可能必须先加入类别/位置表,根据先前加入的所有表加入兴趣,然后根据兴趣选择所有用户。 不幸的是,我对连接 sql 的了解有限。或者甚至有不同的方法可用?

【问题讨论】:

  • 我认为您的数据模型不正确。我认为用户与位置有关,而不是与兴趣有关。
  • “兴趣”表包含附加信息。我刚刚发现可以组合几个查询。这可能是要走的路。现在必须对此进行一些研究。
  • 我应该说,我认为用户与兴趣和位置相关,而不是兴趣与位置相关。
  • 我没有看到用户和事件之间的链接。分享您的模型结构。
  • 用户和事件之间没有直接关系。

标签: sql ruby-on-rails database activerecord


【解决方案1】:

经过一番思考,我认为这个加入会起作用。

class Events
  def get_users

User.joins(%"inner join interests on interests.user_id = users.id
             inner join categories_interests
               on categories_interests.interest_id = interests.id
             inner join categories on categories_interests.category_id = categories.id
             inner join interests_locations
               on interests_locations.interest_id = interests.id
             inner join locations on interests_locations.location_id = locations.id
             inner join categories_events on categories_events.category_id = categories.id
             inner join events_locations on events_locations.location_id = locations.id
             inner join events
               on categories_events.event_id = events.id
               and events_locations.event_id = events.id").where("events.id = :eid", :eid => id)

  end
end

【讨论】:

    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2021-01-07
    • 2013-04-24
    • 2018-11-06
    • 2012-10-18
    • 2012-03-16
    • 2021-12-10
    • 2018-10-17
    相关资源
    最近更新 更多