2011-01-31 10 views
1

私はMySQLでテーブルを作成しました。これらの要素を接続したいと思います。MySQL - 別のテーブル内の同じテーブルの2つの要素をリンクします。

これは、多対多の関係であるべきであり、私が作ってみたことは以下の通りです:

  • 要素を持つテーブルを作成します。

    テーブルを医学

    | id |名前|説明|

  • リンクを持つテーブルを作成します。

    テーブルの非互換性

    を| medicine_id_1 | medicine_id_2 |

私は医学1と医学2間の非互換性を作成したいときに、私は実行する必要があります。

INSERT INTO incompatibilities VALUES 1,2 

と私は医学のIDと互換性のないすべての薬を取得したいと思います= 1私は何をすべきですか:

SELECT * FROM incompatibilities WHERE medicine_id_1=1 OR medicine_id_2=1 

これは正しい方法ですか?これらのクエリは意図したとおりに動作しますか?私は後に何をするより効率的な方法がありますか?そのmedicine_id_1で少なくともIDで、medicine_id_2で最大のIDを持つこと:

は、非互換性が対称非反射の関係であるので、あなたは常に順番に薬を格納する必要があり、事前

答えて

5

でお願いします。

あなたはユニークなインデックスを作成する必要があります。

CREATE UNIQUE INDEX ux_incompatibility_1_2 ON (medicine_id_1, medicine_id_2) 
CREATE UNIQUE INDEX ux_incompatibility_2_1 ON (medicine_id_2, medicine_id_1) 

、値を挿入します。

INSERT 
INTO incompatibility (medicine_id_1, medicine_id_2) 
VALUES (LEAST(@med1, @med2), GREATEST(@med1, @med2)) 

この道を、あなたは、単一のレコード内の両方の方法で関係を格納し、UNIQUE制約が働きます正しく。

SELECT CASE 1 WHEN medicine_id_1 THEN medicine_id_2 ELSE medicine_id_1 END 
FROM incompatibility 
WHERE medicine_id_1 = 1 
     OR medicine_id_2 = 1 
:すべての互換性のない薬を選択するには

関連する問題