2013-07-22 23 views
5

Veritabanımda "tags" adlı bir alana sahip bir tablom var. iOS, Android, Java, JavaScript, vb. Ve bu tablodaki bazı öğeleri eşleştirmek için işaretleyin: eMySQL "like" (yanlış pozitif)

id | isim | etiketler

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

1 | name1 | iOS, Android

2 | name2 | JavaScript, CSS

3 | name3 | Artık HTML, Java

, ben etiketi 'Java', bunu yapmak (id = 3 ile tek) tek öğeleri istiyorsanız: hayal gibi

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

ama , bana ikinci (JavaScript) ve üçüncü (Java) öğelerini döndürür.

Sadece üçüncüsü iade etmek için nasıl yapabilirim? Ayrıca like ile yapabilirsiniz, MySQL ve diğer veritabanları ise

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

ama herşeyin etrafında sınırlayıcıları koymak gerekir:

+2

'SELECT * FROM gönderilerinden WHERE etiketleri '% Java', ' –

+2

Google çoktan çoğa ilişkiler için – zerkms

+0

İlişki tablosunu kullanmalı ve yanıtlarınızı" LIKE "cümleciğini akıllıca – Raptor

cevap

14

MySQL, en iyi çözüm find_in_set() olduğunu

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

Sınırlandırılmış benzer etiketlerle karışıklığı önlemek (iyi, virgül içermeyen karışıklık).

+0

Sadece '%, Java,%' gibi 'LIKE '% Java%';' ve concat (',', tags, ',') arasındaki farkın tam olarak ne olup olmadığını merak ediyorum. Teşekkür ederim. –

+2

@ChristianMark. . . İlk "Javascript" ile eşleşecektir. İkincisi olmaz. –