【发布时间】:2017-07-11 04:22:07
【问题描述】:
我有两组父/子表:
- 推荐/modalities_match_referrals
- 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
-
谢谢。这简单得令人尴尬。