2016-11-23 4 views
0

kein Experte in MySQL noch PHP, sondern aus der unten MySQL-Datenbank übereinstimmt, gefundenErhalten Paare

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 

Wie der Lage sein, MySQL zu finden passende Paare entweder in PHP oder in so dass der Ausgang sein würde (in Dieses Beispiel):

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

Das Ergebnis zeigt die übereinstimmenden Paare. Zum Beispiel wird für Zeilen-ID = ID1, ID2 in Col_A referenziert, und für ID = ID2 wird ID1 in Col_B referenziert, so dass sie übereinstimmen: ID1-ID2 und ID2-ID1. Aber für Zeilen-ID = ID1 wird ID4 in Col_B referenziert, wenn wir in Zeilen-ID = ID4 suchen, gibt es keinen Bezug zu ID1 in Col_A, Col_B oder Col_C, daher gibt es keine Übereinstimmung.

Ich habe mir array_intersect_key in PHP angesehen, bin mir aber nicht sicher, wie man mit der multiplen Rekursivität umgehen soll, und UNION in MySQL, habe aber keine Ahnung, wo ich anfangen soll. Der Unterschied zu dem, was ich bei anderen Fragen gesehen habe, ist, dass hier die ID verwendet wird.

Ich brauche ein bisschen Hilfe hier, danke im Voraus!

+1

I Erhalte deine Definition von gepaarten Paaren nicht ... Warum sind "id1-id2" und "id1-id3" Paare, die übereinstimmen, aber "id1-id4" nicht? –

+0

Es ist überhaupt nicht klar, wie Sie Paare bilden. Kannst du etwas erklären? –

+0

Ja sicher, habe nur eine Erklärung hinzugefügt, um mehr darüber zu erklären, wie man eine Übereinstimmung betrachtet. – hycday

Antwort

0

Dies ist ein Problem in MySQL, da es keine CTEs hat. Der Ort zu beginnen, ist unpivoting die Daten

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; 

Dann Sie einfach wollen eine Selbstverknüpfung dazu:

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; 

Oder man könnte dies exists mit tun:

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

funktioniert perfekt. zeigt die "Duplikate" nicht an, aber es ist in Ordnung, ich habe die Logik verstanden! Vielen Dank – hycday