【问题标题】:MySQL select rows from parent table only if records in child table match records in another child table仅当子表中的记录与另一个子表中的记录匹配时,MySQL才从父表中选择行
【发布时间】:2017-07-11 04:22:07
【问题描述】:

我有两组父/子表:

  1. 推荐/modalities_match_referrals
  2. locations / modalities_match_providers

还有另一个表格modalities,它是我们通常处理的所有模式的列表。

对于任何推荐,我都需要找到可以执行推荐所需的每种方式的提供者列表(位置表)。例如,如果转诊需要 MRI 和关节造影,则列表应仅限于能够同时进行 MRI 和关节造影的人员,即使此类提供者提供了除此转诊所需的其他方式之外的其他方式。

我的问题:是否有一个查询(带有子查询)会生成一个列表,其中仅包含那些可以执行通过modalities_match_referrals 表链接到推荐的所有模式的位置/提供者?

我的问题是当推荐需要不止一种方式时过度包含之一。我的查询生成了一个提供者列表,这些提供者可以执行至少一种模式,并且包括不能执行所有模式的提供者。

这是子表/匹配表:

CREATE TABLE modalities_match_referrals (
id INT AUTO_INCREMENT PRIMARY KEY NOT NULL
,referral_id INT NOT NULL
,modality_id INT NOT NULL
,on_off TINYINT DEFAULT 0
,INDEX(referral_id)
,INDEX(modality_id)
,FOREIGN KEY(referral_id) REFERENCES referrals(id)
,FOREIGN KEY(modality_id) REFERENCES modalities(id)
);

CREATE TABLE modalities_match_providers (
id INT AUTO_INCREMENT PRIMARY KEY NOT NULL
,location_id INT NOT NULL
,modality_id INT NOT NULL
,on_off TINYINT DEFAULT 0
,INDEX(location_id)
,INDEX(modality_id)
,FOREIGN KEY(location_id) REFERENCES locations(id)
,FOREIGN KEY(modality_id) REFERENCES modalities(id)
);

到目前为止我所尝试的 我有一个很长的生产查询,这里不能包含,但是我从这个较短的查询和子查询中得到了相同的提供者列表:

SELECT locations.id AS 'Location ID'
,locations.name AS 'Provider'
FROM locations
JOIN (
    SELECT p.location_id
    FROM modalities_match_providers AS p
    RIGHT JOIN (
    SELECT modality_id
        FROM modalities_match_referrals
        WHERE on_off=1
        AND referral_id=9660        
    ) AS r ON r.modality_id = p.modality_id
    WHERE on_off=1
) AS l ON l.location_id=locations.id

WHERE locations.recycle=0
AND locations.locationstateid=1
GROUP BY locations.id
ORDER BY locations.name
LIMIT 10;

结果包括可以执行 MRI 和/或关节造影的提供者,而我正在寻找的只是那些可以同时执行这两者的提供者。

过去,模式在引荐和位置表中都作为列处理。 sql 要简单得多,但该系统的问题是在引入新模式时这些表有列(这种情况比您想象的要多 - 开放式 MRI 与站立式 MRI 等)

我还在考虑创建一个 PHP 类,以便在将列表呈现到网页上的 while 循环期间调用。该类将在 modalities_match_referrals 和 modalities_match_providers 之间进行比较,并返回 true 或 false。根据返回值,将显示或不显示提供程序。缺点是复杂性,我会担心页面的性能。

提前感谢您提供的任何帮助。

【问题讨论】:

  • HAVING COUNT(*) = 2
  • 谢谢。这简单得令人尴尬。

标签: mysql subquery


【解决方案1】:

将推荐方式与位置交叉加入,以获得最佳结果。然后外部加入供应商的模式,看看实际覆盖了多少。使用GROUP BYHAVING获取不缺少模态的推荐/位置对。

select
  r.referral_id,
  l.id as location_id
from modalities_match_referrals r
cross join locations l
left outer join modalities_match_providers p
  on  p.referral_id = r.referral_id
  and p.modality_id = r.modality_id
  and p.location_id = l.id
group by r.referral_id, l.id
having count(*) = count(p.id)
order by r.referral_id, l.id;

这应该为您提供所有可以执行其所有方式的提供者的所有推荐。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2021-12-30
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多