2016-07-19 7 views
0

Haftungsausschluss: Ich bin sehr neu in MySQL und mache dies als ein Experiment, um mehr zu erfahren.Ähnlichkeit zwischen einer Zeile und vielen Zeilen finden

Im Wesentlichen habe ich eine Tabelle, wo eine Zeile die 'Master' Zeile ist. Ich möchte diese Zeile mit einer Handvoll anderer Zeilen vergleichen. Aus dieser Handvoll möchte ich diejenige auswählen, die die "richtige" oder ähnlichste der Master-Zeile ist und sie in einer Variablen speichern. Wenn keine der wenigen Zeilen dem Master ähnlich ist, möchte ich den Vorgang einfach abbrechen.

Ich kann mir einen Weg vorstellen, dies mit Iteration zu tun, aber ich lese weiter, dass Iteration ist sehr ineffizient/schlechte Praxis mit SQL und will sehen, ob es einen anderen Weg gibt.

Mit diesem Beispiel möchte ich würde Vorlage 2 auszuwählen, und lehnen Anträge 1 und 3.

Type, Answer 1, Answer 2, Answer 3 
Master, 100, 200, 300 
Submission 1, 100, 400, 300 
Submission 2, 100, 200, 300 
Submission 3, 200, 100, 300 

jedoch im folgenden Beispiel, würde ich möchte 1 Vorlage auszuwählen, trotz der zwei nicht genau gleich zu sein.

Type, Answer 1, Answer 2, Answer 3 
Master, 100, 200, 300 
Submission 1, 100, 400, 300 
Submission 2 , 100, 500, 500 
Submission 3, 200, 100, 300 

schließlich hier würde ich möchte Submission 1 wählen, wie es vor der Vorlage 3 auftritt, trotz der zwei das gleiche Maß an richtig zu sein.

Type, Answer 1, Answer 2, Answer 3 
Master, 100, 200, 300 
Submission 1, 100, 400, 300 
Submission 2 , 100, 500, 500 
Submission 3, 500, 200, 300 
+0

Können Sie umfassen eine Beispieltabelle? –

+0

Absolut - ich werde jetzt eins hinzufügen. – GeoGeoGeometry

+0

@Drew LOL ... Ihre Kommentare sind fantastisch. –

Antwort

1

Versuchen Sie die folgende Abfrage. Er berechnet die Anzahl der Antworten, die die Zeile Master mit jeder anderen Zeile gemeinsam hat. Und im Falle der Gleichheit der Anzahl der richtigen Antworten verwendet es den numerischen Unterschied von jeder falschen Antwort, um die nächste Übereinstimmung zu wählen.

SELECT t.Type, t.Answer1, t.Answer2, t.Answer3, 
     (t.a1 + t.a2 + t.a3) AS numRight, 
     (t.d1 + t.d2 + t.d3) AS numOff 
FROM 
(
    SELECT t2.Type, t2.Answer1, t2.Answer2, t2.Answer3, 
      CASE WHEN t1.Answer1 = t2.Answer1 THEN 1 ELSE 0 END AS a1, 
      CASE WHEN t1.Answer2 = t2.Answer2 THEN 1 ELSE 0 END AS a2, 
      CASE WHEN t1.Answer3 = t2.Answer3 THEN 1 ELSE 0 END AS a3, 
      ABS(t1.Answer1 - t2.Answer1) ASd1, 
      ABS(t1.Answer2 - t2.Answer2) AS d2, 
      ABS(t1.Answer3 - t2.Answer3) AS d3 
    FROM yourTable t1 INNER JOIN yourTable t2 
     ON t1.Type = 'Master' AND t2.Type <> 'Master' 
) t 
ORDER BY numRight DESC, numOff 

Wenn Sie nur eine Zeile möchten, können Sie LIMIT 1 bis zum Ende der Abfrage hinzuzufügen.

Demo hier:

SQLFiddle

+0

Vielen Dank! Dies ist viel prägnanter als die Lösung, die ich mir ausgedacht hatte. – GeoGeoGeometry

Verwandte Themen