2013-03-28 5 views
10

Je Majeures REGEXP:Opérateur AND logique dans mySql REGEXP?

SELECT * FROM myTable 
WHERE title REGEXP "dog|cat|mouse"; 

L'ensemble de données est petit, donc je ne suis pas préoccupé par la performance. Et je préfère cette notation sur LIKE, parce que je n'ai pas à concaténer un tas de déclarations "LIKE". Cependant, la notation ci-dessus utilise un opérateur OR logique. Y a-t-il un opérateur AND logique, de sorte que seules les lignes contenant tous les mots-clés sont appariées?

(je me sers InnoDB donc de recherche textuelle pas une option)

+0

Pourquoi la downvote? – user1031947

Répondre

11

Il n'y a vraiment pas de bonne solution sauf concaténer ANDs:

SELECT * FROM myTable 
WHERE title REGEXP "dog" 
AND title REGEXP "cat" 
AND title REGEXP "mouse" 

L'expression régulière serait autrement ressembler à ceci:

SELECT * FROM myTable 
WHERE title REGEXP "(dog.*cat.*mouse)|(dog.*mouse.*cat)|(mouse.*dog.*cat)|(mouse.*cat.*dog)|(cat.*dog.*mouse)|(cat.*mouse.*dog)" 
+0

merci, c'est ce que j'avais peur de. – user1031947

0

opération AND peut être accessible que par le mysql-ET:

WHERE title REGEXP 'dog' AND title REGEXP 'cat' AND title REGEXP 'mouse' 

cela ne montrera que les entrées où tous les mots-clés sont dans le champ de titre. comme

title = "this is about mouse, cat and dog" 
0

Vous pouvez ajouter plusieurs conditions avec AND entre eux:

SELECT * FROM myTable 
WHERE title REGEXP "dog" AND title REGEXP "cat" AND title REGEXP "mouse"; 

Peut-être REGEXP est pas nécessaire ici et vous pouvez utiliser à la place INSTR (régulière sont généralement plus lents):

SELECT * FROM myTable 
WHERE INSTR(title, "dog") AND INSTR(title, "cat") AND INSTR(title, "mouse"); 
0

Vous pouvez utiliser la recherche en texte intégral en mode booléen:

SELECT * FROM table WHERE MATCH(colmun_name) AGAINST('+dogs +cat' IN BOOLEAN MODE); 

Vous devez indexer d'abord votre table:

ALTER TABLE table ADD FULLTEXT(column_name);