Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有多个连接的Rails中的高级查询_Sql_Ruby On Rails_Activerecord_Join - Fatal编程技术网

Sql 具有多个连接的Rails中的高级查询

Sql 具有多个连接的Rails中的高级查询,sql,ruby-on-rails,activerecord,join,Sql,Ruby On Rails,Activerecord,Join,我有一桌人。我也有一个事件表;每个活动都有多个节目(,每个节目都有多张票,每张票可能有买家(一个人),也可能没有买家(一个人)。不过每个人都可以有多张不同活动的票 我当前的尝试如下所示: Person.joins(tickets: {shows: :events}).where("events.id" => 1) 并生成以下SQL: SELECT * FROM "people" INNER JOIN "tickets" ON "tickets"."buyer_id" =

我有一桌人。我也有一个事件表;每个活动都有多个节目(,每个节目都有多张票,每张票可能有买家(一个人),也可能没有买家(一个人)。不过每个人都可以有多张不同活动的票

我当前的尝试如下所示:

Person.joins(tickets: {shows: :events}).where("events.id" => 1)
并生成以下SQL:

SELECT *
  FROM "people"
  INNER JOIN "tickets"
    ON "tickets"."buyer_id" = "people"."id"
  INNER JOIN "shows"
    ON "shows"."id" = "tickets"."show_id"
  INNER JOIN "events"
    ON "events"."id" = "shows"."event_id"
WHERE
  "events"."id" = 1;
但我的理解是,查询只会为每个人返回一张票证。我不太了解我的联接,但可以安全地假设我需要在人和票证之间有一个正确的外部联接,以便显示每个票证(从而表示每个事件).这是否正确?我如何在ActiveRecord/Arel中实现这一点


我如何找到所有拥有特定活动门票的人?

我也不是DB专家,但据我所知,这就是它的工作方式:

  • 人们内部加入票证将为您提供每一张拥有的票证的一行 由一个人(如果一个人有多张票证,则包含重复的人员条目)
  • 内部连接显示只会将显示添加到行中 (假设每张票只属于一场演出)
  • 内部加入活动只会添加活动信息(假设每个节目只属于一个活动)
  • 其中event.id=1将只在表中保留事件id为1的行
  • 我想这就是你要找的

    顺便说一句,上面代码中的命名约定表明您可能对关系的定义有问题。我希望它是:

    Person.joins(票证:{show::event})
    而不是


    Person.joins(票证:{shows::events})
    由于票证属于一个节目,而节目属于一个活动。我是否遗漏了什么?

    此查询将实际返回人员而不是票证。您能否澄清您的目标?我想找到所有拥有特定活动票证的人员。因此,我认为您的查询应该做到这一点。您是否期待不同的结果当一个人有多张票时?如果一个人有多张票,那么他们不是每行只返回一张票吗?这并不保证返回的票与我要查找的事件匹配。因此,如果一个人购买多个事件的票,如果查询返回,我很可能会错过这些票错误的票证。这就是为什么我认为我可能需要一个正确的外部联接。但不知道如何实现它。就是这样。我不希望人们会乘以票证数量,但这就是我所寻找的结果。查询正在工作,谢谢!