2013-07-22 16 views
5

Mam tabelę w mojej bazie danych, z polem o nazwie "tagi", np. iOS, Android, Java, JavaScript itd. Chcę wybrać wszystkie pozycje z tej tabeli, które pasują do jakiegoś tagu, np.MySQL "jak" (fałszywy alarm)

id | imię | znaczniki

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

1 | name1 | iOS, Android

2 | name2 | JavaScript, CSS

3 | name3 | HTML, Java

teraz, jeśli chcę tylko te elementy, które mają tag 'Java' (tylko jeden z id = 3), mogę to zrobić:

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

ale, jak można sobie wyobrazić , zwraca mi drugie (JavaScript) i trzecie (Java) elementy ..

Jak mogę zrobić, aby zwrócić tylko trzeci?

+2

'SELECT * FROM WHERE stanowisk tagi LIKE„%”;' Java –

+2

Google dla wielu do wielu relacji – zerkms

+0

należy użyć tabeli relacji zamiast, i zrobić 'klauzula LIKE' rozsądnie, – Raptor

Odpowiedz

14

W MySQL, najlepszym rozwiązaniem jest find_in_set():

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

W MySQL oraz inne bazy danych, można też zrobić to z like, ale trzeba umieścić ograniczniki wokół wszystko:

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

Ograniczenie zapobiega pomyleniu z podobnymi tagami (dobrze, zamieszanie, które nie zawiera przecinków).

+0

Zastanawiam się tylko, jaka dokładnie jest różnica między 'LIKE '% Java%';' i 'concat (',', tags, ',') takimi jak '%, Java,%';'. Dziękuję Ci. –

+2

@ Christianmark. . . Pierwszy dopasuje "Javascript". Drugi nie. –

Powiązane problemy