У меня есть такие категории: Основные категории (кошка):
Пример подкаталога:
Для основной категории 1:
Для основной категории 2:
Для основной категории 15:
Я хотел бы найти регулярное выражение для MYSQL, которое находит категории, начинающиеся с категории.
Например (с примером выше):
Поиск категорий начинается с 1 должен вернуться:
Если я сделаю свое регулярное выражение, у меня будет это:
Поиск категорий начинается с 1.1 должен вернуться:
Если я сделаю свое регулярное выражение, у меня будет это:
Поиск категорий начинается с 2.1 должен вернуться:
Если я сделаю свое регулярное выражение, у меня будет это:
Спасибо за помощь :)
Мне интересно, что именно вы используете для своего RegEXP - php или sql. У них разный синтаксис. Мне также интересно, к какому синтаксису относится \b. Я не могу найти ссылку на синтаксис SQL(actually MySQL) за 5 минут, но я знаю, что это совершенно правильный Php synthax
Спасибо, я использую mysql для регулярного выражения. Я проверю \b. Я нашел это для \b: [stackoverflow.com/questions/6403104/…]), но я не знаю, как должно выглядеть мое регулярное выражение
что ты уже испробовал?






Я не думаю, что вам вообще нужно регулярное выражение, и, возможно, оно слишком усложняет его.
Если вы знаете, какую категорию вы хотите найти, предполагая, что пользователь запрашивает раздел «1.1», раздел «1.2» или «1.4.1», вы можете искать с помощью подстановочного знака.
Вы не упоминаете, хранятся ли эти данные в виде десятичного числа или varchar, поэтому я предполагаю, что это varchar, и только потому, что в большинстве баз данных, которые я когда-либо видел, они всегда сохраняются именно так.
Итак, если категория была 1.1, а вы хотели 1.1.0, 1.1.1, 1.1.12 и т. д., вы просто искали бы все, что соответствует 1.1.%, что означает поиск всего, что соответствует 1.1, за которым следует точка, а не следует непосредственно число.
Пример запроса:
$category = "1.1";
$sql = "SELECT * FROM [your_table] WHERE cat LIKE '".$category.".%'";
Этот запрос будет соответствовать:
1.1.0
1.1.1
1.1.15
// Any anything else starting with 1.1.
Спасибо, я чувствую себя глупо, что не подумал об этом простом запросе... это быстрее, чем Regex?
@AdamWhateverson - «Поиск категорий, начинающихся с 1.1, должен вернуться» не включает «1.1». Пожалуйста, добавьте его или уточните, что он намеренно исключен. Другие ответы либо медленные, либо неправильные.
Для MySQL до 8.0.4 вы можете использовать маркер конца слова ([[:>:]]) в регулярном выражении, чтобы избежать выбора подкатегорий, начинающихся, например, с. 2.12, когда вы ищете 2.1. Попробуйте что-то вроде этого:
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1[[:>:]]'
Для MySQL 8.0.4 и более поздних версий он поддерживает \b в качестве границы слова, и вы можете использовать его вместо этого (обратите внимание на необходимость дублировать \, поскольку MySQL интерпретирует его как escape-символ внутри строк):
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1\\b'
Для основной категории 1: LIKE '1.%'
Для основной категории 15: LIKE '15.%'
.
Для категории 2.1: LIKE '2.1.%'
Кроме того, используя LIKE, вы можете использовать INDEX(cat) для повышения производительности.
Но... Этого может быть недостаточно. (И я утверждаю, что Вопрос был здесь неоднозначным.) Если может быть запись только с '2.1' (без подкаталога), то эти лайки неадекватны. Так...
План A: col REGEXP '^2[.]1([.]|$)' -- Но REGEXP не будет использовать никаких индексов.
План Б: col = '2.1' OR col LIKE '2.1.%' -- ButOR` предотвращает использование index.
План C: неуклюжий, но самый быстрый для больших наборов данных (из-за индекса):
WHERE col LIKE '2.1%' -- uses INDEX(col) for quick filtering
AND col REGEXP '^2[.]1([.]|$)' -- avoids "2.15" and other things
Почему скобки вокруг .?:
. сам по себе соответствует любому одному символу - не нужно этого[.] соответствует любому набору символов, включая только точку\. соответствует точке, но, в зависимости от контекста, вам может понадобиться 1, 2 или 4 обратной косой черты.Итог: для простоты используйте план B. Для производительности используйте план C.
Похоже, вам нужно использовать
\b