2017-07-10 98 views
0

我有兩套父/子表:MySQL的選擇行只有在子表中匹配記錄的記錄在另一個子表

  1. 推薦/ modalities_match_referrals
  2. 位置/ modalities_match_providers

還有另一種表格模式,它是我們通常處理的所有模式的列表。

對於任何推薦,我需要找到一個提供商列表(位置表),它可以執行推介所需的每種模式。例如,如果轉診需要MRI和arthrogram,則該列表應限於可執行MRI和arthrogram的列表,即使此類提供者除了此轉診所需的其他方式之外也提供其他方式。

我的問題:是有一個單一的查詢(子查詢),這將導致只有那些位置/供應商誰可以執行所有通過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; 

結果包括可以進行核磁共振成像和/或arthrograms提供商和我所期待的只是那些誰可以執行兩個供應商。

過去,在引用和位置表中作爲列處理的模式。 sql比簡單得多,但是當系統引入新的模式時,該系統的問題是在列表中添加列(這種情況超出了你的想象 - 打開MRI對比MRI等)

我是也考慮創建一個PHP類,在while循環中將該列表呈現到網頁上。該類將執行modalities_match_referrals和modalities_match_providers之間的比較,並返回true或false。根據返回值,提供者將被顯示或不顯示。缺點是複雜性,我會擔心頁面的性能。

非常感謝您提供的任何幫助。

+1

HAVING COUNT(*)= 2 – Strawberry

+0

謝謝。這簡直令人尷尬。 – commodore64

回答

0

將引薦模式與位置交叉連接以獲得最佳結果。然後外部加入提供商的模式,看看實際覆蓋了多少。使用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; 

這應該給大家推薦與可以執行他們所有的方式都提供商。

+0

謝謝Thorsten! – commodore64

相關問題