подскажите список регулярок в запросах MySQL

Тема в разделе "Базы данных", создана пользователем romas_s, 6 дек 2017.

Статус темы:
Закрыта.
Модераторы: latteo
  1. romas_s

    romas_s

    Регистр.:
    9 ноя 2012
    Сообщения:
    243
    Симпатии:
    67
    Подскажите плз кто шарит, какие правила регулярных выражений можно использовать в MySQL запросах????

    Список всех правил написания регулярок PHP: info.za500.biz/programmirovanie/item/regulyarnye-vyrazheniya-manual

    Можно все правила PHP регулярок использовать в MySQL запросах?? или только какие то особенные??

    Ясное дело в запросе прописывается REGEXP
    Знаю что можно использовать в MySQL запросах след список правил составления регулярных выражений:
    ^ - начало строки
    $ - конец строки
    непосредственно сам символ или целое слово.
     
  2. BaBL

    BaBL

    Регистр.:
    13 ноя 2012
    Сообщения:
    165
    Симпатии:
    106
    В запросах в БД регулярные выражения не применяются на практике практически нигде, потому что работают адово медленно, а твоя задача скорее всего решается и другими методами.

    Лучше расскажи что у тебя не получается, а не спрашивай как реализовать придуманное хреновое решение.
     
    Black Hat и Den1xxx нравится это.
  3. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    244
    Симпатии:
    87
    romas_s нравится это.
  4. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    379
    Симпатии:
    132
    Кстати нормальный мануал, только нужно учитывать, что регулярки начали работать кажись с версии MySQL 5.5, а много где ещё стоит 4 версии...
    И когда я ковырялся с регулярками - не получалось экранировать различные скобки для их выбора в строках - приходилось использовать блоки вида [.characters.] и с ними код начинал работать. Типа { = [.left-curly-bracket.], } = [.right-curly-bracket.]...
     
  5. romas_s

    romas_s

    Регистр.:
    9 ноя 2012
    Сообщения:
    243
    Симпатии:
    67
    Вот зачем собственно хочу регулярку использовать в запросе:

    Есть сайт info.za500.biz/programmirovanie/php

    пользователь выбирает список интересующих его тегов. (чекбоксы, селекты)
    В результате должны быть только те материалы в которых встречаются все выбранные пользователем теги.

    Хочу делать выборку с базы данных по след условию:

    К примеру мне нужен материал в статье которого одновременно будут присутствовать теги: for, function, class
    Поскольку поиск по содержимому статьи будет громоздким и длинным - имеется в таблице колонка tag, в которую я при сохранении статьи вписываю теги со статьи.
    Теги хранятся в таблице отдельной колонкой tag

    Как построить запрос что бы с базы выбирались только те записи в которых присутствуют все выбранные теги.??

    Хотелось бы сделать выборку 1 запросом с базы.
    Если делать отдельными запросами по каждому тегу отдельно, выходит что материалы дублируются.

    Как можно сделать выборку с базу так, что бы потом не фильтровать полученные данные с базу на предмет дублирования материалов???.

    Ранее когда тегов было мало, все было удобно, но когда тегов стало очень много, стало не удобно выбирать нужные материалы. + новые теги будут постоянно добавляться по мере изучения новых тегов программирования.

    Сайт на Joomla, хочу создать модуль фильтрации материалов по тегам.
    Компонент ZOO, расширение JBZOO.
    Фильтр JbZOO мне не подходит - нужно для фильтрации создавать новые поля, это крайне не удобно при написании статьи, каждый новый тег нужно вносить как новое значение поля.

    Временное решение - google поиск для сайта, но новые статьи не сразу появляются в индексе - в этом вся соль(((.


    Как правильно разбивать теги на категории пока не придумал, но разговор сейчас не об этом.

    Для меня сейчас главный вопрос - правильно построить запросы выборки данных с базы (логику).
    Вот для этого собственно и нужны регулярки в запросе.
     
    Последнее редактирование: 8 дек 2017
  6. BaBL

    BaBL

    Регистр.:
    13 ноя 2012
    Сообщения:
    165
    Симпатии:
    106
    У тебя первая проблема не в регулярках, а в кривой схеме БД. Посмотри что такое нормализация данных.

    Таблицу тегов нужно вынести отдельно, связь у тебя многие-ко-многим,у одной статьи может быть несколько тегов, один тег может принадлежать нескольким статьям. Реализуй эту связь, поставь 2 индекса (а точнее 2 foreign key) и будешь очень быстро одним запросом выбирать эти статьи.

    Поверь, твоя задача присутствует в 90% проектов в интернете и 99% из них не исопльзуют для ее решения регулярки.
     
    romas_s нравится это.
  7. romas_s

    romas_s

    Регистр.:
    9 ноя 2012
    Сообщения:
    243
    Симпатии:
    67

    Как бы Вы составили запрос выборки с базы данных по условию:
    в материале должны обязательно присутствовать все 3 тега: for, echo, if
    Сами теги можно хранить где угодно и в каком угодно виде с любой структурой.

    Наведите пример, как бы Вы сделали такую выборку на примере, структуру базы данных берите какую угодно, какая Вам нравится.
    Меня интересует как будет выглядеть тот самый 1 запрос выборки данных по 3 тегам одновременно.
     
  8. BaBL

    BaBL

    Регистр.:
    13 ноя 2012
    Сообщения:
    165
    Симпатии:
    106
    Ну вариантов много, можно хоть так:

    Код:
    SELECT * FROM article a join `article_tag` at on at.article_id = a.id where at.tag_id in (2,3) group by a.id having count(*) = 2
    
     
    romas_s нравится это.
  9. romas_s

    romas_s

    Регистр.:
    9 ноя 2012
    Сообщения:
    243
    Симпатии:
    67
    А всего навсего нужно было вписать все 3 параметра поиска по тегу в скобку сравнения )).
    WHERE tag IN (for,echo,if)

    sqlinfo.ru/forum/viewtopic.php?pid=37304?pid=37304
    тут нашел все что мне нужно, поиск по любому кол условий 1 поля + выборка уникальных записей без повторов.

    Вопрос решен, тему можно закрывать.
     
    Последнее редактирование: 10 дек 2017
  10. BaBL

    BaBL

    Регистр.:
    13 ноя 2012
    Сообщения:
    165
    Симпатии:
    106
    Только не делай схему как в первом посте по этой ссылке. Этот паттерн называется EAV и он антипаттерн.
     
Статус темы:
Закрыта.