Просто подстроки, но тогда найдешь не тэги, а именно подстроки:
SELECT * FROM memes WHERE tags LIKE '%eng%' AND tags LIKE '%history%' AND tags LIKE '%anime%' ORDER BY id DESC LIMIT 20
Если тэги разделить пробелами (
" tag1 tag2 tag3 "), будет искать целые слова:
SELECT * FROM memes WHERE tags LIKE '% eng %' AND tags LIKE '% history %' AND tags LIKE '% anime %' ORDER BY id DESC LIMIT 20
Если есть пробелы внутри самих тэгов, то нужно их в тэге предварительно заменить каким-либо символом. Если пробелы в самих тэгах заменять "_" подчёркиванием, а не чем-то другим, то это немного усложнит запрос. Потому что "
_" и "
%" - это зарезервированные символы в операторе LIKE, поэтому, если эти символы встречаются в тэгах, - нужно будет добавить Escaping, например для тэгов "
rus_eng" и "
100%":
SELECT * FROM memes WHERE tags LIKE '% rus\_eng %' ESCAPE "\" AND tags LIKE '% 100\% %' ESCAPE "\" ORDER BY id DESC LIMIT 20
(и не забудь, что сам символ обратного слэша вызывает проблемы в коде, так что может его лучше на что-то другое заменить, например на "
/")
Если тэги разделять запятыми ("
,tag1,tag2,tag3,"), можно искать подстроки типа "
,tag1," :
SELECT * FROM memes WHERE tags LIKE '%,eng,%' AND tags LIKE '%,history,%' AND tags LIKE '%,anime,%' ORDER BY id DESC LIMIT 20
или так:
SELECT * FROM memes WHERE instr(tags, ',eng,') AND instr(tags, ',history,') AND instr(tags, ',anime,') ORDER BY id DESC LIMIT 20
или, если разделять пробелами (
" tag1 tag2 tag3 "):
SELECT * FROM memes WHERE instr(tags, ' eng ') AND instr(tags, ' history ') AND instr(tags, ' anime ') ORDER BY id DESC LIMIT 20
Это всё для SQLite
Если тебе для Microsoft или Oracle, то почитай про CONTAINS - он работает быстрее.
Да, а если нужно пересечение по любым из тэгов - просто используй оператор
OR вместо
AND в вышеприведённом коде.