Задать вопрос
lxstvayne
@lxstvayne
Люблю Python

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

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

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

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽