2009-01-23 54 views
32

NHƯ điều hành trong MySql được sử dụng để tìm các hàng có chứa nội dung truy vấn của chúng tôi, ví dụ:MySQL: Phiên bản ngược lại của LIKE là gì?

select name from user where name like "%john%" 

đó sẽ trở lại John Smith, Peter Johnson, vv

Nếu tôi cần điều ngược lại - để tìm các hàng được CONTAINED trong văn bản truy vấn của chúng tôi? Ví dụ tôi cung cấp cho nó John Smith and Peter Johnson are best friends và muốn nó tìm cho tôi tất cả các tên từ bảng có thể được tìm thấy trong chuỗi này.

Làm cách nào để thực hiện điều đó?

+1

Tôi cũng bị nhầm lẫn bởi câu hỏi. Trên đỉnh đầu của tôi, về việc sử dụng công cụ tìm kiếm FullText thích hợp, ví dụ: Nhân sư hay Solr/Lucene? –

+0

Tôi nghĩ rằng whats yêu cầu ở đây là một cái gì đó như thế này chọn tên từ người dùng mà tên trong (Chuỗi tìm kiếm) "John Smith và Peter Johnson là những người bạn tốt nhất". Đầu ra phải là Johm Smith, Peter Johnson, vv, miễn là chúng có tên. Về cơ bản, tìm kiếm văn bản ĐẦY ĐỦ ngược lại. – Dheer

Trả lời

43

Đây là một cách bạn có thể đạt được những gì bạn mô tả:

SELECT name FROM user 
WHERE 'John Smith and Peter Johnson are best friends' LIKE 
    CONCAT('%', name, '%') 
+1

Dheer. Oh? Dường như nó có tác dụng với Joel. http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause – Zoredache

-2

Đây là sự cố lập chỉ mục văn bản. Nếu tôi làm đúng, nhiệm vụ của bạn là tìm tất cả các tham chiếu đến mọi người trong văn bản dạng tự do và không liên quan gì đến LIKE hoặc NOT LIKE.

Trong biểu mẫu chung, bảng cơ sở dữ liệu mà bạn đang tìm kiếm tham chiếu hoạt động như từ điển đối với một số thuật toán lập chỉ mục văn bản. Xây dựng một chỉ mục trên chuỗi đầu vào bằng cách sử dụng từ điển này và hy vọng bạn sẽ nhận được một số kết quả phù hợp.

1
select name 
from users 
where instr('John Smith and Peter Johnson', name) > 0 

Tôi thà sử dụng phương pháp này thay vì:

select * 
from users 
WHERE 'John Smith and Peter Johnson' LIKE CONCAT('%', name ,'%') 

bởi vì nếu có bất kỳ cơ hội mà các name thể chứa ký tự % hoặc _ (ví dụ: name = 'v% alue') thì truy vấn trên sẽ vẫn trả về bản ghi đó không chính xác. Cũng lưu ý rằng nếu cột của bạn có thể chứa dấu gạch chéo ngược và/hoặc "C escape characters" thì chúng cũng sẽ cần phải được thoát. Tất cả điều này được giải thích trong MySQL String Comparison Functions. Ví dụ dưới đây SQL sẽ trở lại 1:

SELECT 'val\%ue' LIKE CONCAT('%', 'al\\\\\%u' ,'%'); 

Các dấu chéo ngược đơn cần thiết để được thoát với \\\\% nhân vật đã trốn thoát: \%.

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