2016-10-09 8 views
2

Ich habe 2 Tabellen in meinem SchemaWie Ergebnis sortieren basierend auf dem Eintrag in anderer Tabelle

Tabelle A

+----+------+------+------+ 
| id | col1 | col2 | col3 | 
+----+------+------+------+ 
| 1 | abc | NULL | abc | 
| 2 | abc | NULL | NULL | 
| 3 | NULL | abc | abc | 
+----+------+------+------+ 

Tabelle B

+------+------+------+ 
| col1 | col2 | col3 | 
+------+------+------+ 
| NULL | abc | abc | 
| abc | NULL | abc | 
| abc | abc | abc | 
+------+------+------+ 

ich alle auswählen möge die Datensätze in der Tabelle A und sortieren sie, wenn es den gleichen Eintrag in der Tabelle 2 hat.

In diesem Fall meine Antwort wäre

+----+------+------+------+ 
| id | col1 | col2 | col3 | 
+----+------+------+------+ 
| 1 | abc | NULL | abc | 
| 3 | NULL | abc | abc | 
| 2 | abc | NULL | NULL | 
+----+------+------+------+ 

Jede Hilfe oder Begriff

+0

Was passiert, wenn Tabelle B mehr als einen Datensatz enthält? –

+0

Welche Zeilen mit der Tabelle2 übereinstimmen, muss am Anfang der resultierenden Antwort stehen. –

+0

Das beantwortet meine Frage nicht wirklich, also werde ich wohl noch einmal fragen. Was passiert, wenn Tabelle B mehr als einen Datensatz enthält? –

Antwort

1

So etwas sollte funktionieren würde geschätzt:

SELECT id, col1, col2, col3 
FROM (
    SELECT id, col1, col2, col3, matches, 
      @seq := IF(@id = id, @seq + 1, 
        IF(@id := id, 1, 1)) AS seq 
    FROM (
     SELECT t1.id, t1.col1, t1.col2, t1.col3, 
      IF(t2.col1 IS NULL, 0, 1) + IF(t2.col2 IS NULL, 0, 1) + 
      IF(t2.col3 IS NULL, 0, 1) AS matches 
     FROM tableA AS t1 
     LEFT JOIN tableB AS t2 
     ON COALESCE(t1.col1,0) = COALESCE(t2.col1,0) OR 
      COALESCE(t1.col2,0) = COALESCE(t2.col2,0) OR 
      COALESCE(t1.col3,0) = COALESCE(t2.col3,0)) AS t 
    CROSS JOIN (SELECT @seq := 0, @id :=0) AS vars   
    ORDER BY id, matches DESC ) AS x 
WHERE x.seq = 1 
ORDER BY x.matches DESC, x.id 

Die Abfrage verwendet eine LEFT JOIN Betrieb mit OR Unternehmer der ON Klausel, um alle zu erhalten mögliche Übereinstimmungen jedes Datensatzes von mit jedem Datensatz von tableB. Variablen werden verwendet, um den am besten übereinstimmenden Datensatz von pro id zu erhalten. Das Ergebnis wird nach der Anzahl der Übereinstimmungen jedes tableA Datensatzes geordnet.

Demo here

Hinweis: Die Abfrage geht davon aus, dass col1, col2, col3 nie 0 den Wert nehmen.

+0

Kann ich auch die Anzahl der Zeilen mit der Tabelle b für jede Zeile in Tabelle A als neue Spalte in der Antwort übereinstimmen lassen? Damit die Zeilen, die nicht mit der Tabelle b übereinstimmen, die Zählung als 0 haben? –

+0

@SamuelRobert Ja, meine Abfrage verwendet hierfür das Feld 'matches'. Fügen Sie es einfach in die SELECT-Klausel ein. –

+0

Vielen Dank !!! –

Verwandte Themen