2013-07-22 31 views
5

Tôi có một bảng trong cơ sở dữ liệu của mình, với một trường có tên là "tags", ví dụ: iOS, Android, Java, JavaScript, v.v. Và tôi muốn chọn tất cả các mục trong bảng này, những người khớp với một số thẻ, ví dụ:MySQL "like" (false positive)

id | tên | thẻ

- | ------- | -----

1 | name1 | iOS, Android

2 | name2 | JavaScript, CSS

3 | name3 | HTML, Java

bây giờ, nếu tôi muốn chỉ mục có tag 'Java' (chỉ một với id = 3), tôi làm điều này:

SELECT * FROM posts WHERE tags LIKE '%Java%'; 

nhưng, như bạn tưởng tượng , nó trả về cho tôi thứ hai (JavaScript) và thứ ba (Java) các mặt hàng ..

Tôi có thể làm gì để chỉ trả lại hàng thứ ba?

+2

'CHỌN * TỪ bài đăng WHERE tags LIKE '% Java'; ' –

+2

Google cho nhiều mối quan hệ – zerkms

+0

Bạn nên sử dụng bảng quan hệ thay thế và đặt mệnh đề' LIKE' một cách khôn ngoan – Raptor

Trả lời

14

Trong MySQL, giải pháp tốt nhất là find_in_set():

SELECT * 
FROM posts 
WHERE find_in_set('Java', tags) > 0; 

Trong MySQL và cơ sở dữ liệu khác, bạn cũng có thể làm điều này với like, nhưng bạn cần phải đặt delimiters quanh tất cả mọi thứ:

SELECT * 
FROM posts 
WHERE concat(',', tags, ',') like '%,Java,%'; 

Các delimited ngăn chặn sự nhầm lẫn với các thẻ tương tự (tốt, nhầm lẫn mà không liên quan đến dấu phẩy).

+0

Tôi chỉ tự hỏi chính xác sự khác biệt giữa 'LIKE '% Java%';' và 'concat (',', tags, ',') như '%, Java,%';'. Cảm ơn bạn. –

+2

@ChristianMark. . . Giá trị đầu tiên sẽ khớp với ''Javascript''. Thứ hai sẽ không. –

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