Frage von PapaSchlumpf9, 32

Wie sortiere ich in SQL/MySQL eine SELECT Abfrage mit mehreren LIKE Operatoren in der WHERE-Clause nach Häufigkeit der Treffer an Spalten und Content?

Ich habe eine Tabelle mit z.B. folgenden Spalten: id | vorname | nachname | spalte3 | spalte4

Jetzt habe ich aus einem Formular variable 1-4 Werte mit denen ich suchen kann. Diesen WHERE Syntax generiere ich mit PHP, je nachdem ob ein Feld ausgefüllt ist oder nicht. So entsteht z.B.

WHERE first_name LIKE '%Max%' OR last_name LIKE '%Mustermann%' OR spalte3 LIKE '%value%'

Es kann auch vorkommen, dass ich z.B. nur einen Wert habe

WHERE first_name LIKE '%Max%'

Nun möchte ich, wenn ich nach mehreren Spalten suche nach Trefferhäufigkeit sortieren. Sprich haben alle 4 Spalten den richtigen Wert, soll dieser natürlich zuerst erscheinen. Trifft nur ein LIKE zu soll der Treffer natürlich als letztes aufgelistet sein. Aufgrund von OR bekomme ich sehr viele Treffer, weshalb ich die SELECT Funktion mit LIMIT 10 begrenze.

Wie eben erläutert sollen dann die 10 Ausgaben mit den meisten zusammenhängenden Treffern (Spalten) angezeigt werden und nicht die, wo z.B. nur der Vorname zutrifft.

Ich hoffe ihr könnt mein Problem nachvollziehen - ziemlich schwer zu erläutern...

Im Web bin ich auf Volltextsuche gestoßen, was allerdings - wenn ich das richtig verstanden habe - mehrere Spalten auf denselben Wert durchsucht. In meinem Beispiel habe ich aber immer verschiedene Werte pro Spalte.

Bitte um Hilfe :)! Wenn es einen besseren Ansatz wie LIKE und OR gibt gerne.

Findet sich keine Antwort, muss ich wohl alle Results mit PHP nach dem genannten Prinzip filtern - müsste doch aber besser gehen?

Antwort
von PapaSchlumpf9, 32

I found the / a better solution:

SELECT *,
      ((col like 'term1') +
        (col like 'term2') +
         . . .
        (col like 'termN')
      ) as numMatches
FROM table
HAVING numMatches > 0
ORDER BY numMatches desc
LIMIT 10;

From this post: http://stackoverflow.com/questions/18221869/search-for-multiple-values-sort-by-r...

Antwort
von KnusperPudding, 28

Ich denke ich habe dein Problem verstanden. Wäre es denn eine Option, wenn du Pro Bedingung ein Select machst?

D.h.

SELECT firstName FROM tabelle WHERE first_name LIKE '%Max%' 
SELECT firstName FROM tabelle WHERE last_name LIKE '%Mustermann%'
? mit diesem Szenario könntest du dir Pro Select ein COUNT(*) As AnzahlTreffer Mit ausgeben lassen. Anschließend 'schweißt' du das ganze via 'Union all' zusammen. Womit du am ende wieder eine Tabelle hat, jedoch mit der neuen Spalte: "AnzahlTreffer" nach der du sortieren kannst.

Keine passende Antwort gefunden?

Fragen Sie die Community