2016-08-23 20 views
1

私は3つのテーブルを割り当てています。 最初のテーブル: 患者:patid、fname、lname、recordnum。 PATIENTDR:patid、drid、 患者:patid、clinid。IDが2番目または3番目のテーブルに高効率で存在する場合、最初のテーブルから選択する方法は?

DRID = "$ docotr-> id"またはCLINID = "$ clinicの場合は" PATIENTDR "テーブルの" PATID "がテーブル" PATIENTDR "にある場合、患者をfnameまたはlnameで選択する必要があります。 - > clinid「

この患者さんの数が非常に高くなることが私のクエリ

SELECT t1.* FROM patient t1 
WHERE patlname like '{$search_patlname}%' 
AND patfname like '{$search_patfname}%' 
AND 
( 
EXISTS 
    (SELECT patid FROM patientdr t2 WHERE t2.drid = '{$doctor->id}' AND t2.patid = t1.patid) 

    OR EXISTS 

    (SELECT patid FROM patientclin t3 WHERE t3.clinid = '{$clinic->clinid}' AND t3.patid = t1.patid) 
) 
LIMIT 10 

で、データは、Ajaxを使用してノート以下の配慮を取り入れる取得されます:

」を使用したSQL文サブクエリはRE-RUN foであるため、MySQLのEXISTS条件は非常に非効率的ですr外部クエリのテーブル内のすべての行。 "012"を使用しないほとんどのクエリを書くことがより効率的です "

このクエリを書くにはもっと効率的な方法がありますか?ルールを破って患者の名前と名前をpatientdrとpatientclinのテーブル、または10行に結果を制限することにより、応答時間を短縮することが十分に効率的である事前にヘルプのすべての種類の おかげ

+1

これらを内部結合すると、IDに一致するものがない場合、それらは結果に返されません。私はそれが最も効率的だと思います。 –

答えて

1

コメントで述べたように、これは簡単なINNERで解決することができ、JOIN:?。

SELECT t1.* 
FROM patient t1 
INNER JOIN (
    SELECT patid 
    FROM patientdr t2 
    WHERE t2.drid = '{$doctor->id}' 
    UNION DISTINCT 
    SELECT patid 
    FROM patientclin t3 
    WHERE t3.clinid = '{$clinic->clinid}' 
) i 
ON t1.patid = i.patid 
WHERE patlname like '{$search_patlname}%' 
AND patfname like '{$search_patfname}%' 
LIMIT 10 

INNER JOINのドキュメントを読んでいない場合は、これを行う時間、それを使用するいくつかのクエリで遊ぶことができます。

幸運を祈る!

+0

@jakebules Hm ..同じIDが他の2つのテーブルにある場合、私は結果として2人の患者を得ています。結果はこのクエリで結合されるべきではなく、1人のIDの結果として1人の患者しか存在しないのでしょうか? – Dime

+0

@ jakebulesはUNION DISTINCTでそれを修正しました。 – Dime

+1

私は自分の答えを更新しました。 –

関連する問題