2017-07-10 15 views
0

は私が親/子テーブルの二組持っている場合にのみ、親テーブルから行を選択します。MySQLは別の子テーブルの子テーブルの一致レコードのレコード

  1. 紹介/ modalities_match_referrals
  2. 場所/ modalities_match_providers

私たちが一般的に扱うすべてのモダリティのリストである別のテーブルモダリティがあります。

どの紹介についても、紹介で必要とされるそれぞれのモダリティを実行できるプロバイダ(場所表)を見つける必要があります。例えば、紹介がMRIと関節炎を必要とする場合、この紹介者はMRIと関節炎の両方を行うことができる人に限定すべきである。たとえそのような提供者がこの紹介に必要なモダリティ以外のモダリティを提供しているとしても。

私の質問:はmodalities_match_referralsテーブルを通じて紹介にリンクされている様式のすべてを行うことができる唯一のこれらの場所/プロバイダのリストになります(サブクエリを持つ)単一のクエリがありますか?

私の問題は、紹介に複数のモダリティが必要なときに、過剰に含まれているという問題があります。私のクエリは、少なくとも1つのモダリティを実行することができ、すべてのモダリティを実行することができないプロバイダを含むプロバイダのリストになります。ここで

は、テーブルに一致/子です:

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のおよび/またはarthrogramsを行うことができプロバイダを含めて、私が探していますが、両方を行うことができる唯一のものを提供しています。

従来は、参照先と場所の両方の表で列として扱われたモダリティがありました。 SQLの方がはるかに単純でしたが、新しいモダリティが導入されたときに、そのシステムの問題が発生しました(オープンMRIとMRIの違いなど)

私はwhileループ中に呼び出されるPHPクラスを作成して、リストをWebページにレンダリングすることも考えています。このクラスは、modalities_match_referralsとmodalities_match_providersの比較を行い、trueまたはfalseを返します。戻り値に基づいて、プロバイダが表示されるか、表示されません。欠点は複雑で、私はページのパフォーマンスに懸念があります。

ありがとうございます。ご協力いただきありがとうございます。

+1

ありがとうございます(*)= 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

関連する問題