Ответы пользователя по тегу SQLite
  • Как проверить пересечение SQL lite?

    @devdb
    SELECT * FROM memes WHERE tags LIKE "%anime%" OR tags LIKE "%eng%"


    При этом, если поле tags записи содержит "anime" или "eng", то такая запись будет выдана в списке найденных.
    А если не содержит - её в списке не будет. Это то пересечение, которое нужно?
    Подробнее про то как правильно оформить тэги в поле tags таблицы memes здесь
    Ответ написан
    Комментировать
  • Как выбрать 20 записей по условию?

    @devdb
    Просто подстроки, но тогда найдешь не тэги, а именно подстроки:
    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 в вышеприведённом коде.
    Ответ написан
    Комментировать