MySQL-Name LIKE '%#attributes.q#%' – Gibt kein Ergebnis für eine genaue Übereinstimmung zurück?
-
19-09-2019 - |
Frage
Ich habe die folgende MySQL-Abfrage:
SELECT *
FROM customer
WHERE
fName LIKE '%#attributes.q#%' AND deleted = 'N'
OR
lName LIKE '%#attributes.q#%' AND deleted = 'N'
Dies funktioniert gut für Vermutungen, aber wenn Sie eine genaue Übereinstimmung angeben:„Bill Clinton“ fname=bill lname = clinton Für die obige Abfrage erhalten Sie 0 Ergebnisse?wo Bill Clint Ergebnisse liefert.
Wie kann diese Abfrage aktualisiert werden, um LIKE-Ergebnisse und EQUAL TO-Ergebnisse zu finden?
Lösung
Anhand Ihrer Frage ist das schwer zu erkennen, aber ich vermute, dass Ihre Kundentabelle in etwa so aussehen wird:
id fName lName deleted
---------------------------------
1 John Doe N
2 Bill Clinton N
3 Fred Smith N
4 George Bush Y
Ihre Anfrage, wie Sie sie in Ihrer Frage angegeben haben, wird niemals funktionieren, da sie so aussehen wird:
SELECT *
FROM customer
WHERE fname LIKE '%Bill Clinton%' AND deleted = 'N'
OR
lName LIKE '%Bill Clinton%' AND deleted = 'N'
Es gibt keine Datensätze in der Tabelle, in denen die Felder „fName“ ODER „lName“ „Bill Clinton“ enthalten.
Sie müssten Ihren #attributes.q#-Text massieren, damit etwa Folgendes generiert wird:
SELECT *
FROM customer
WHERE ((fName LIKE '%Bill%') OR (fName LIKE '%Clinton%')) AND deleted = 'N'
OR
((lName LIKE '%Bill%') etc.....
LIKE-Vergleiche ähneln stark der Verwendung von Platzhaltern in Dateinamen.Sie teilen keinen Textblock für Sie auf, sondern sagen Ihnen wörtlich, ob ein Textblock innerhalb eines anderen Textblocks vorhanden ist.
Ich denke, was Sie brauchen, ist ein Volltextsuche, das einzelne Wörter in einer Abfragezeichenfolge berücksichtigt und Ergebnisse zurückgibt.Natürlich ist FULLTEXT nur für MyISAM-Tabellentypen verfügbar. Wenn Sie also InnoDB oder einen anderen Typ verwenden, haben Sie Pech.
Andere Tipps
FYI - Volltextindizes können nur mit Innodb- oder MyISAM -Tabellen verwendet und nur für Zeichen für Zeichen, VARCHAR oder Text erstellt werden.