ペア

2016-11-23 7 views
0

ないのMySQLやPHPの専門家ではなく、MySQLデータベース以下からマッチングゲット:ペア

出力に(なるようにPHPやMySQLの中のいずれかに一致するペアを見つけることができるようにする方法
ID Col_A Col_B Col_C 
id1 id2  id4  id3 
id2 id3  id1  id6 
id3 id8  id1  id5 
id4 id3  id7  id5 
id5 id9  id4  id1 

をこの例では):

id1-id2 
id1-id3 
id2-id1 
id3-id1 
id4-id5 
id5-id4 

結果に一致するペアが表示されます。たとえば、行ID = id1の場合、id2はCol_Aで参照され、id = id2の場合、id1はCol_Bで参照されるため、id1-id2とid2-id1と一致します。しかし行ID = id1の場合、ID4はCol_Bで参照されます。行ID = id4を見ると、Col_A、Col_B、Col_Cにはid1への参照がないため、一致しません。

私はPHPでarray_intersect_keyを見ましたが、ここで複数の再帰を処理する方法やMySQLでのUNIONを確認する方法はありませんでしたが、どこから始めるべきか分かりません。 私が他の質問で見たものとの違いは、ここでIDは一致するために使用されることです。

私はここで少し助けが必要です、事前に感謝!

+1

私が開始する場所は、あなたが簡単なこの上で自己参加したい、そして、データ

select id, col_a as id2 from t union all select id, col_b as id2 from t union all select id, col_c as id2 from t; 

をアンピボットされます一致するペアの定義を取得しないでください...なぜ 'id1-id2'と' id1-id3'は 'id1-id4'と一致するペアですか? –

+0

ペアをどのように形成しているのかはまったく明らかではありません。いくつかの説明を追加できますか? –

+0

はい、確かに、マッチを検討する方法を説明するための説明を追加しました。 – hycday

答えて

0

これはCTEを持たないため、MySQLの痛みです。

select t1.id, t1.id2 
from (select id, col_a as id2 from t union all 
     select id, col_b as id2 from t union all 
     select id, col_c as id2 from t 
    ) t1 join 
    (select id, col_a as id2 from t union all 
     select id, col_b as id2 from t union all 
     select id, col_c as id2 from t 
    ) t2 
    on t1.id = t2.id2 and t1.id2 = t2.id 
where t1.id < t1.id2; 

それとも、あなたがexistsを使用してこれを行うことができます:

select t.id, t.id2 
from (select id, col_a as id2 from t union all 
     select id, col_b as id2 from t union all 
     select id, col_c as id2 from t 
    ) t 
where exists (select 1 from t t2 where t2.id = t.id2 and t2.col_a = t.id) or 
     exists (select 1 from t t2 where t2.id = t.id2 and t2.col_b = t.id) or 
     exists (select 1 from t t2 where t2.id = t.id2 and t2.col_c = t.id); 
+0

は完全に機能します。 does notは '重複'を表示しますが、それは問題ありません、私は論理を理解しました!ありがとう – hycday