2011-06-29 25 views
29

Tôi có một truy vấn chọn nơi tôi đang cố gắng để chuỗi tìm kiếm nhiều mẫu'NHƯ (' %% này 'OR '% rằng%') và một cái gì đó = khác' không làm việc

LIKE ('%this%' or '%that%') and something=else 

Returns không có kết quả

Tuy nhiên

LIKE '%this%' and something=else 

lợi nhuận kết quả và

LIKE '%that%' and something=else 

trả về kết quả

Có thể đưa tất cả kết quả của tôi vào một truy vấn không? Nếu một chuỗi khớp với cả hai, thì nó sẽ xử lý như thế nào?

+0

Nếu bạn có kiểm tra lỗi thích hợp, bạn đã nhận được thông báo về lỗi cú pháp trong truy vấn đầu tiên. Ở mức tối thiểu bạn nên có một cái gì đó như 'mysql_query (...) hoặc chết (mysql_error()); ' –

+1

Câu trả lời tuyệt vời như hướng dẫn trong chủ đề liên quan: http://stackoverflow.com/a/4808757/2906290 –

Trả lời

57

Thật tuyệt nếu bạn có thể, nhưng bạn không thể sử dụng cú pháp đó trong SQL.

Hãy thử điều này:

(column1 LIKE '%this%' OR column1 LIKE '%that%') AND something = else 

Lưu ý việc sử dụng dấu ngoặc! Bạn cần chúng xung quanh biểu thức OR.
Không có dấu ngoặc vuông, nó sẽ được phân tích cú pháp là A OR (B AND C), sẽ không cung cấp cho bạn kết quả mong đợi.

+0

+1 Beat tôi bằng 57 giây. Một tùy chọn khác để xem xét là Tìm kiếm Toàn văn (FTS) –

+2

Cảm ơn! Lỗi này có vẻ rất rõ ràng khi bạn biết nó là gì :) –

1

Các bạn đã thử:

(column LIKE '%this%' and something=else) or (column LIKE '%that%' and something=else) 
+1

Trong khi điều này sẽ làm việc (và có thể dẫn đến chính xác cùng một kế hoạch sau khi tối ưu hóa), hình thức không phân phối thường được ưa thích - ít nhất là cho con người. –

4

Hãy thử một cái gì đó như:

WHERE (column LIKE '%this%' OR column LIKE '%that%') AND something = else

2

Bạn có một cái gì đó chống lại tách nó lên?

...FROM <blah> 
    WHERE 
    (fieldA LIKE '%THIS%' OR fieldA LIKE '%THAT%') 
    AND something = else 
3

lao ra LIKE khoản vào 2 báo cáo riêng biệt, ví dụ:

(fieldname1 LIKE '%this%' or fieldname1 LIKE '%that%') and something=else 
19
Instead of using `LIKE` use `REGEXP`. 

For example: 

    REGEXP 'THIS|THAT' 

For example: 

    REGEXP 'THIS|THAT' 
mysql> SELECT 'pi' REGEXP 'pi|apa';      -> 1 
mysql> SELECT 'axe' REGEXP 'pi|apa';     -> 0 
mysql> SELECT 'apa' REGEXP 'pi|apa';     -> 1 
mysql> SELECT 'apa' REGEXP '^(pi|apa)$';    -> 1 
mysql> SELECT 'pi' REGEXP '^(pi|apa)$';     -> 1 
mysql> SELECT 'pix' REGEXP '^(pi|apa)$';    -> 0 

Refer: 
http://dev.mysql.com/doc/refman/5.1/en/regexp.html 
+2

http://dev.mysql.com/doc/refman/5.1/en/regexp.html – mcmillab

+0

Sạch hơn và khách quan hơn nhiều so với việc sử dụng nhiều LIKES. – ivanleoncz

+2

Ví dụ dễ đọc hơn: 'SELECT id FROM mytable WHERE description REGEXP" chó | mèo " –

0

Tôi biết đó là một câu hỏi hơi cũ nhưng vẫn còn những người cố gắng tìm giải pháp hiệu quả để thay vào đó bạn nên sử dụng FULLTEXT index (nó có sẵn từ MySQL 5.6.4).

Query trên bàn với hồ sơ + 35 triệu bởi ba like ở nơi khối mất ~ 2.5s nhưng sau khi thêm chỉ mục trên các lĩnh vực này và sử dụng BOOLEAN MODE bên match ... against ... nó chỉ 0.05s mất.

Các vấn đề liên quan