我有兩套父/子表:MySQL的選擇行只有在子表中匹配記錄的記錄在另一個子表
- 推薦/ modalities_match_referrals
- 位置/ 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。根據返回值,提供者將被顯示或不顯示。缺點是複雜性,我會擔心頁面的性能。
非常感謝您提供的任何幫助。
HAVING COUNT(*)= 2 – Strawberry
謝謝。這簡直令人尷尬。 – commodore64