Das Feld table
.name
enthält 'Stylus Photo 2100' und die folgende Abfrage
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'
Ich bekomme keine Ergebnisse. Natürlich würde ich, wenn ich suchen würde
SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'
Wie kann ich den Datensatz auswählen, indem Sie nach 'Stylus 2100' suchen?
Vielen Dank
Wenn Sie die Reihenfolge Ihrer Wörter kennen, können Sie Folgendes verwenden:
SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'
Sie können auch verwenden:
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'
Ich denke, die beste Lösung wäre, reguläre Ausdrücke zu verwenden. Es ist am saubersten und wahrscheinlich das effektivste. Reguläre Ausdrücke werden in allen gängigen DB-Engines unterstützt.
In MySql gibt es den RLIKE
-Operator, so dass Ihre Abfrage ungefähr so aussehen würde:SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
Ich bin nicht sehr stark in regexp, also hoffe ich, dass der Ausdruck in Ordnung ist.
Bearbeiten
.__ Die RegExp sollte eher sein:
SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'
Weitere Informationen zur Unterstützung von MySql regexp:
http://dev.mysql.com/doc/refman/5.1/de/regexp.html#operator_regexp
Sie können jedes Leerzeichen einfach durch %
ersetzen.
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
Die richtige Lösung ist eine Volltextsuche (wenn Sie sie verwenden können) https://dev.mysql.com/doc/refman/5.1/de/fulltext-search.html
Das macht fast was Sie wollen:
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100)+.*(Stylus|2100)+';
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*';
Dies wird jedoch auch mit "210021002100" übereinstimmen, was nicht so toll ist.
schau auf http://www.techonthenet.com/sql/like.php
mit LIKE '% Stylus 2100%' fragen Sie nach einer Zeichenfolge, die genau 'Stylus 2100' enthält, und 'Stylus Photo 2100' enthält diese Zeichenfolge nicht.
sie müssen so etwas tun,
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';
oder
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';
Angenommen, Ihre Suche ist stylus photo 2100
. Versuchen Sie, das folgende Beispiel verwendet RLIKE
.
SELECT * FROM `buckets` WHERE `bucketname` RLIKE REPLACE('stylus photo 2100', ' ', '+.*');
EDIT
Eine andere Möglichkeit ist die Verwendung von FULLTEXT
index für die bucketname
- und MATCH ... AGAINST
-Syntax in Ihrer SELECT
-Anweisung. Um das obige Beispiel neu zu schreiben ...
SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));
SELECT name
FROM table
WHERE name
LIKE '% Stylus% 2100%'