2010-03-02 26 views
9

Tôi có sau kiểm tra chuỗi engine/mail/key và một bảng mà trông như thế này:Tìm hàng phù hợp nhất trong MySQL (InnoDB)

+-------------+ 
| query  | 
+-------------+ 
| engine  | 
| engine/pdf | 
| engine/mail | 
+-------------+ 

tôi muốn tìm hàng phù hợp nhất. Kết quả phù hợp nhất được chỉ định bởi các ký tự phù hợp nhất từ ​​đầu chuỗi/hàng.

Tôi đã xây dựng một RegExp, nhưng tất nhiên nó phù hợp với tất cả các hàng và sẽ không cung cấp cho tôi bất kỳ thông tin nào khớp với hầu hết các ký tự/phần.
biểu thức chính quy: ^engine(/mail(/key)?)?

Tôi có một ý tưởng khác về việc sử dụng FIND_IN_SET chức năng của MySQL như thế này:

`FIND_IN_SET(query,'engine,engine/mail,engine/mail/key')` 

Và đặt kết quả của nó là đầu ra.

Điều đó sẽ hiệu quả nhưng không phải là giải pháp tốt đẹp. Có ai có một ý tưởng tốt hơn về điều này?

Trả lời

9

Chỉ cần sử dụng LIKE, nhưng cách khác xung quanh những gì bạn có thể đã từng sử dụng.

select query 
from table1 
where 'engine/mail/key' like concat(query,'%') 
order by length(query) desc 
limit 1 

Kết quả:

mysql> select * from query; 
+-------------+ 
| query  | 
+-------------+ 
| engine  | 
| engine/pdf | 
| engine/mail | 
+-------------+ 
3 rows in set (0.00 sec) 

mysql> select query from query 
     where 'engine/mail/key' like concat(query,'%') 
     order by length(query) desc 
     limit 1; 
+-------------+ 
| query  | 
+-------------+ 
| engine/mail | 
+-------------+ 
1 row in set (0.01 sec) 
+1

này không phù hợp với bất cứ điều gì. Ngoài ra thứ tự của 'LENGTH (truy vấn)' là không đủ, vì cũng có thể là một hàng như 'engine/website' mà sau đó sẽ được chọn trên' engine/mail'. –

+0

Xin lỗi, tôi đã sửa lỗi truy vấn để nó sẽ chạy. Hãy thử ngay bây giờ để xem liệu nó có mang lại cho bạn kết quả mong đợi hay không. –

+0

Cảm ơn điều này, tốt hơn nhiều so với 'FIND_IN_SET' hack! Sử dụng 'LIKE' cách khác arround như thế này thực sự là một thủ thuật gọn gàng! –

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