2013-03-28 20 views
10

używam MySQL REGEXP:Logiczny operator AND w mySql REGEXP?

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

Zbiór danych jest mała, więc nie jestem zaniepokojony wydajności. I wolę to od LIKE notacji, ponieważ nie muszę łączyć się z kilkoma stwierdzeniami "LIKE".

Powyższa notacja używa operatora logicznego OR. Czy istnieje logiczny operator AND, aby dopasować tylko wiersze zawierające wszystkie słowa kluczowe?

(używam InnoDB tak pełny a nie szukanie opcja)

+0

Dlaczego upadek? – user1031947

Odpowiedz

11

Naprawdę nie ma fajnego rozwiązania z wyjątkiem konkatenacji AND:

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

Wyrażenie regularne będzie inaczej wyglądać następująco:

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

dzięki, tego się bałem. – user1031947

0

AND operacja może być dostępna tylko przez MySQL oraz:

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

to pokaże tylko te wpisy, gdzie wszystkie słowa kluczowe są w polu tytułu. jak

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

Można dodać kilka warunków z AND między nimi:

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

Może REGEXP nie ma potrzeby tutaj i można użyć INSTR zamiast (regularne są zazwyczaj wolniejsze):

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

Można użyć wyszukiwanie pełnotekstowe w trybie logicznej:

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

Musisz Indeks tabelę pierwszy:

ALTER TABLE table ADD FULLTEXT(column_name);