2016-04-21 4 views
0

私は患者を想定し 二つのテーブルの医師と患者の二つの列がある持っていると言うとき、照会する方法、ID、NPIは、各patientidsフィールドができ patientids複数の患者のid値を持つ それで、Idの医者のテーブルを与えられれば、医者に属する患者に質問することができます。MySQLは:IDと名前 は医師を想定し、3つの列があります:別のテーブルのレコードのフィールドのidが

私は、次のSQLを試してみましたが、それは小さなデータセットでは何も

select p.Name from patients p 
where p.Id in (select patientIds from doctors d where [email protected]); 
+4

あなたは 'FIND_IN_SET'を使用することができます。しかし、 'doctors.patientids'カラムを正常化する方が良いでしょう。 –

+2

@PaulSpiegelが言ったことは、 'doctors_patients'テーブルが必要なことです。値リストの解析は、RDBMSでやりたい最後のものの1つです。 – Uueerdo

+0

ありがとうございます。 @PaulSpiegel @ Uueerdo –

答えて

0

を返さない、これは十分に速い:

SELECT p.Name 
    FROM patients p 
    JOIN doctors d ON [email protected] AND FIND_IN_SET(p.id, d.patientIds) 
; 

しかし、実際に、コメンターが述べたように、 patientsdoctorsの間の関係を仲介する結合テーブルが必要です。多対多の関係を

+0

パフォーマンスだけではありません。それはコードの複雑さです。医師の患者リストからpatientIDを削除するたびに、リストを解析して再構築する必要があります。データベースから患者を完全に削除したい場合はもちろんです。ただし、クエリが機能します。 –

+0

@PaulSpiegelコードの複雑さがパフォーマンスのバランスを取ることに同意します。しかし、私はその質問に関係なくそれに同意するでしょう。この質問だけでは、これが書き込みアクティブなデータベースであるか純粋なレポートデータベースであるかわかりません。われわれが知っている限り、データセットは静的であり、OPはそのデータをいくつか報告するだけです。 (これは私が想定したものです。なぜなら、この構造をアクティブな書き込みに使用しようとする人はいないからです。) – bishop

0

ジェネリック答え/テンプレート:

SELECT [fields you want] 
FROM tableA 
[INNER|LEFT] JOIN ["middle" table] AS AB ON tableA.id = AB.A_id 
[INNER|LEFT] JOIN tableB ON AB.B_id = tableB.id 
;