2016-09-28 12 views
0

IDに基づいて2つの他の表を接続する表があります。これは、多対多の関係を作成するために使用されます。 3つのテーブルは以下の通りです。多対多の結合表のIDを分離するSQL問合せ

Table 1 table_1_id name ...

Join Table table_1_Id table_2_Id

Table 2 table_2_id data ...

結合表を言って、私はtable_2_idののコレクションを与えていると私はどの見つける必要がありtable_1_id年代とtable_2_ids 1, 1 1, 2 1, 3 2, 2 2, 3 3, 3

ための次のデータを持っていますtable_1_idは、それらのtable_2_idsとまったく同じです。例えば。私が与えられたテーブル2のidが(2,3)ならば、私が取得したいidは2になります。コレクション(1,2,3)が与えられれば、必要なidは1になります。 (2,3)は、table_1_idが1であることを返さないことに注意してください。なぜなら、両方の関係を持っていても、それらの関係のみを正確には持たないからです。

これを達成するためのSQLクエリは何でしょうか?

+0

だから、 'table_2_id = table_1_id'言うことを意味ですか? – Rahul

+0

いいえ、私はあなたがここで何を意味しているのかよく分かりません。私は物事を理解しやすくするために唯一のIDを使っていました。それが役に立ったら、テーブル2のIDに10を追加するだけで、table_1_idsとはまったく違うものになります。 –

答えて

0

これを行うことができるのは、現在のDB構造では、返される行の数を数え、検索するIDの数と一致させることだけです。たとえば:

SELECT table_1_id, COUNT(table_1_id) 
FROM `join_table` 
WHERE table_2_id 
IN (2, 3) 
GROUP BY table_1_id 

このクエリは、MySQL(すなわち、PHP/ASP)の外のリターンを評価するために、あなたが必要になりますが、私はそれが絶対に必要だならば、MySQLの内部で動作するように書き換えることができると思います。これについて

+0

これも私が考えていた方向だった。それは動作しません。その結果は(1,2)、(2,2)、(3,1)となる。だからid 1とid 2の両方に2の数があるように見えます。 –

+0

@JohnBakerあなたのクエリが次のように見えるように、テーブル構造をCSV列に並べ替えることは可能ですか? 'SELECT table_1_id WHERE ids = '2,3 '? –

0

方法:

SELECT table_1_id FROM (
    SELECT table_1_id, GROUP_CONCAT(table_2_id) AS all_t2_ids 
    FROM join_table 
    WHERE table_2_id IN (2,3) 
) Q 
WHERE all_t2_ids = '2,3' 
関連する問題