2 Stimmen

Mysql wählen Sie Übereinstimmung 4, 5 oder 6 Spalten

Ich erstelle eine benutzerdefinierte Suche in einer DB mit 6 verschiedenen Spalten. Um die Suche durchzuführen, habe ich 6 verschiedene Eingabefelder, die nur Zahlen akzeptieren.

Ich habe die Suche mit den 6 Spalten bereits zum Laufen gebracht, der Code:

SELECT * FROM data 
WHERE 1_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a')
AND 2_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a')
AND 3_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a')
AND 4_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a')
AND 5_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a')
AND 6_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a')
ORDER BY id ASC;

Dies liefert das richtige Ergebnis unabhängig von der Eingabe-Reihenfolge.

Aber ich möchte, dass das SELECT mir Ergebnisse liefert, ob es Übereinstimmungen mit 4 oder 5 der eingegebenen Zahlen findet. Ich habe es mit OR versucht, weiß aber nicht, wie ich die Anzahl der übereinstimmenden Spalten definieren soll.

Ist das möglich?

Vielen Dank für die Aufmerksamkeit!

Bearbeiten: -------------------

Ich bin mit dem von dbaseman bereitgestellten Code ins Stocken geraten.

Weil ich zwar ein richtiges Ergebnis bekomme, aber wirklich nicht weiß, ob es durch das Matching von 4, 5 oder 6 Spalten generiert wurde.

Ich habe versucht, ein CASE WHEN nachträglich einzufügen, aber es funktioniert nicht.

Gibt es eine Möglichkeit herauszufinden, welche Kombination von Spalten mir das Ergebnis lieferte?

Habe an so etwas gedacht (ungefähr) wenn = 4, dann Ergebnis-4, sonst wenn = 5, dann Ergebnis-5...usw... Und dann in der Lage sein, die Zeile in einem Array zu platzieren.

Danke!

4voto

McGarnagle Punkte 98711

Statt die Verwendung von und/oder, fassen Sie die Treffer zusammen:

SELECT *,
    CASE WHEN 1_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_1,
    CASE WHEN 2_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_2,
    CASE WHEN 3_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_3,
    CASE WHEN 4_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_4,
    CASE WHEN 5_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_5,
    CASE WHEN 6_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_6,

    CASE WHEN 1_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 2_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 3_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 4_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 5_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 6_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    AS anzahl_von_treffern
FROM daten 
WHERE 
    (
    CASE WHEN 1_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 2_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 3_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 4_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 5_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    + CASE WHEN 6_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END
    ) in (4,5,6)
ORDER BY id ASC;

Alternativ, etwas schöner mit einer verschachtelten Abfrage:

SELECT a.*, a.match_1+a.match_2+a.match_3+a.match_4+a.match_5+a.match_6 AS anzahl_von_treffern
FROM (
    SELECT *,
        CASE WHEN 1_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_1,
        CASE WHEN 2_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_2,
        CASE WHEN 3_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_3,
        CASE WHEN 4_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_4,
        CASE WHEN 5_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_5,
        CASE WHEN 6_spalte IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_6
        FROM daten 
    ) a
WHERE a.match_1+a.match_2+a.match_3+a.match_4+a.match_5+a.match_6 in (4,5,6)
ORDER BY id ASC;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X