lxstvayne
@lxstvayne
Люблю Python

Как выбрать 20 записей по условию?

Мне нужно выбрать с id допустим 300 20 записей, которые проходят по условию: если хотя бы один тег (eng, anime, history) входит в поле записи tags.
Вот, что я пока что придумал: SELECT * FROM memes LIMIT 20 OFFSET {last_id - 21}
А как условие прописать я не знаю. Мне нужно вернуть 20 записей, которые проходят по условию.
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
@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 в вышеприведённом коде.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Wispik
SELECT * FROM memes WHERE id > 300 AND tags in ('eng', 'anime', 'history') LIMIT 20
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы