2012-06-21 6 views
18

Tôi đã truy vấn sau đây:Đặt hàng SQL bằng LIKE mạnh nhất?

SELECT * FROM table_name 
WHERE (col_1 LIKE '%$keyword%' 
    OR col_2 LIKE '%$keyword%' 
    OR col_3 LIKE '%$keyword%') 
    AND .... <some optional filters> ... 

là có một chiến lược để sắp xếp dựa trên kết quả phù hợp nhất?

+1

Bằng cách "phù hợp nhất" , bạn có nghĩa là một trận đấu trên 'col_1' có ưu tiên cao hơn so với trận đấu trên' col_2', v.v ... không? – Wiseguy

+0

Điều gì cấu thành các kết quả có liên quan nhất? – codewaggle

+0

ý của bạn là "lọc" thay vì "sắp xếp"? – Sebas

Trả lời

26

Khi bạn nói về "sự liên quan ", bạn thực sự muốn tìm kiếm ngôn ngữ tự nhiên, được hỗ trợ bởi MySQL full-text searches. Cú pháp khác với các truy vấn bình thường như và bạn cần phải thêm chỉ mục đặc biệt vào bảng, nhưng việc sắp xếp theo mức độ liên quan là có thể theo cách này.

Sau đây là cách MySQL tính phù hợp (từ liên kết):

Khi MATCH() được sử dụng trong một mệnh đề WHERE, như trong ví dụ thể hiện trước đó, hàng trả lại sẽ được tự động sắp xếp với sự liên quan cao nhất đầu tiên . Giá trị liên quan là các số dấu phẩy động không âm. Mức độ liên quan không có nghĩa là không giống nhau. Mức độ liên quan được tính dựa trên số lượng từ trong hàng, số từ duy nhất trong hàng đó, tổng số từ trong bộ sưu tập và số lượng tài liệu (hàng) có chứa một từ cụ thể.

Để create a full-text index on an existing table, sử dụng toàn văn modifier:

CREATE FULLTEXT INDEX index_name 
ON table_name (col1, col2, col3) 

Sau đó, bạn có thể thực hiện một truy vấn như thế này để lấy kết quả theo thứ tự liên quan:

SELECT * FROM table_name 
WHERE MATCH (col1,col2,col3) 
AGAINST ('keyword' IN NATURAL LANGUAGE MODE); 
3

Bạn không thể. Bạn đang yêu cầu RDBMS của bạn sắp xếp kết quả theo hàng có cột "THÍCH" nhất khớp với giảm dần. Ví dụ:

MySQL thực hiện việc này với chỉ số FULLTEXT.

28

Nếu bạn có ý nghĩa col_1 đó là thích đáng hơn col_2 và như vậy, sau đó:

select * 
     ,case when col_1 like '%$keyword%' then 1 
      when col_2 like '%$keyword%' then 2 
      when col_3 like '%$keyword%' then 3 
     end as [priority] 
    from table_name 
where col_1 like '%$keyword%' 
    or col_2 like '%$keyword%' 
    or col_3 like '%$keyword%' 
order by [priority] 

Nếu bạn có nghĩa là với các trận đấu cột nhất thì:

select * 
     ,(case when col_1 like '%$keyword%' then 1 else 0 end) + 
     ,(case when col_2 like '%$keyword%' then 1 else 0 end) + 
     ,(case when col_3 like '%$keyword%' then 1 else 0 end) as [priority] 
    from table_name 
where col_1 like '%$keyword%' 
    or col_2 like '%$keyword%' 
    or col_3 like '%$keyword%' 
order by [priority] desc 
+3

+1 để tạo thứ hạng tùy chỉnh – Wiseguy

+0

Chỉ cần kiểm tra nó, bạn không cần truy vấn con, cập nhật câu trả lời. –

+4

Không biết nếu nó chỉ là tôi, nhưng tôi đã phải loại bỏ ** dấu phẩy sau dấu cộng (_ + _) ** và dấu ngoặc đơn (_ [] _) từ '[priority]' ** cho mã để làm việc. – Giraldi