1

好的,所以我确定这是一个非常令人困惑的问题。让我尝试更清楚地解释...

问题:

在此处输入图像描述

Schema 很简单,本质上是:

在此处输入图像描述

我正在处理一个非常大的数据集,需要将所有内容编译成 1 个有效的查询。有几个一对多的关系,我正在尝试“过滤”数据集。

我想要至少有 1 个与给定 ID 匹配的 preceptor 的事件的所有 preceptor 关联。

例如,我有一个“事件”实体,它可以有零个或多个与之关联的“指导者”。我的用户的过滤器需要允许他们选择一个“preceptor”并返回具有给定 preceptor ID 的所有事件。好吧,这很容易。但是我仍然需要列出其他导师 - 我需要仍然查询其他关系,但需要至少 1 个关联来匹配给定的标准。

我希望这更有意义。一旦查询到数据,我总是可以“过滤”数据,但我想避免获得不相关的数据,因为它是一个如此庞大的数据集。

这是我的代码片段:

        $qb->select($selectPartials)
       ->from('EventLegacy', 'e')
       ->leftJoin('e.site', 's')
       ->leftJoin('s.program_site_associations', 'psa')
       ->leftJoin('e.base', 'b')
       ->leftJoin('b.program_base_associations', 'pba')
       ->leftJoin('e.preceptor_associations', 'pa')
       ->leftJoin('pa.preceptor', 'pre')
       ->andWhere('e.program = ?3')
       ->andWhere('e.start_datetime >= ?1')
       ->andWhere('e.start_datetime <= ?2')
       ->andWhere('psa.active = true')
       ->andWhere('psa.program = ?3')
       ->andWhere('pba.active = true')
       ->andWhere('pba.program = ?3')
       ->andWhere('pre.id = ?4')
       ->orderBy('e.start_datetime')
       ->setParameter(1, $startDate)
       ->setParameter(2, $endDate)
       ->setParameter(3, $program)
       ->setParameter(4, $preceptorId);

        return $qb->getQuery()->getArrayResult();

等效的 SQL 查询:

SELECT *
FROM EventData e0_
LEFT JOIN AmbulanceServices a1_ ON e0_.site_id = a1_.AmbServ_id
LEFT JOIN ProgramSiteData p2_ ON a1_.AmbServ_id = p2_.AmbServ_id
LEFT JOIN AmbServ_Bases a3_ ON e0_.StartBase_id = a3_.Base_id
LEFT JOIN ProgramBaseData p4_ ON a3_.Base_id = p4_.Base_id
LEFT JOIN EventPreceptorData e5_ ON e0_.Event_id = e5_.Event_id
LEFT JOIN PreceptorData p6_ ON e5_.Preceptor_id = p6_.Preceptor_id
WHERE (e0_.Program_id = 287)
  AND (e0_.start_datetime >= ?)
  AND (e0_.start_datetime <= ?)
  AND (p2_.Active = 1)
  AND (p2_.Program_id = 287)
  AND (p4_.Active = 1)
  AND (p4_.Program_id = 287)
  AND (p6_.Preceptor_id = 179293)
ORDER BY e0_.start_datetime ASC

这里有一些可能有用的假数据。

假设我总共有 3 个事件。(id, name)
1, eventA
2, eventB
3, eventC

eventA 有 2 个 preceptor,eventB 没有,eventC 有 1 个。所以,我们的 EventPreceptorData 表应该是这样的:
(id, event_id, preceptor_id)
1,1,1
2,1,2
3, 3,1

我们的 prceptor (PreceptorData) 可能看起来像这样 (id, name)
1, Bob
2, Chris

因此,如果我正在搜索 Bob,我希望看到事件 A 和 C,并且我希望我的输出是:

eventA 导师
:鲍勃,克里斯

eventB 导师
:鲍勃

我的问题是“克里斯”没有被列出(考虑到我的查询,这非常有意义)。

4

0 回答 0