it-swarm.com.de

MySQL SELECT LIKE oder REGEX zum Abgleichen mehrerer Wörter in einem Datensatz

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 

56
Alessio Firenze

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%'
89
SERPRO

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

28
Ondrej Bozek

Sie können jedes Leerzeichen einfach durch % ersetzen.

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
17
Melvin Protacio

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.

5
Martin

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.

3
divol

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', ' ', ','));
0
Peter Darmis

SELECT name FROM table WHERE name LIKE '% Stylus% 2100%'

0
Gopalakrishnan