Попробуй это:
/^(?:[1-9]|[1-4][0-9]|50)$/
ОБНОВИТЬ:
Теперь, когда я вижу, что вопрос был обновлен, чтобы относиться к MySQL, это значительно меняет ситуацию. Вышеупомянутое регулярное выражение использует незахватывающие скобки, которые не поддерживаются MySQL. Но также возникает вопрос; вы действительно должны использовать регулярные выражения для решения этой проблемы? Нам действительно нужно посмотреть, как вы храните свои числа, которые должны быть от 1 до 50. Они varchar
? Они int
? Я покажу, как решить это в обоих направлениях. Сначала я настрою тестовую таблицу с индексами:
create table regextest (
id int unsigned primary key auto_increment,
varchar_number varchar(5) not null,
int_number int not null,
index(varchar_number),
index(int_number)
) engine=innodb;
Теперь поместите в него несколько тестовых данных, чтобы убедиться, что все наши пограничные случаи покрыты:
insert into regextest (varchar_number, int_number)
values ('0', 0), ('1', 1), ('35', 35), ('49', 49), ('50', 50), ('51', 51);
А теперь вот запрос, который решит вашу проблему, предполагая, что ваши числа хранятся в виде строк в столбце varchar_number
:
mysql> select * from regextest where varchar_number rlike '^([1-9]|[1-4][0-9]|50)$';
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
| 2 | 1 | 1 |
| 3 | 35 | 35 |
| 4 | 49 | 49 |
| 5 | 50 | 50 |
+----+----------------+------------+
4 rows in set (0.00 sec)
Это работает, но плохо работает с большими наборами данных, поскольку не может использовать индекс, даже если он присутствует. MySQL должен запускать регулярное выражение один раз для каждой строки в таблице. Предположим, ваши числа от 1 до 50 были сохранены как int
s в столбце int_number
. Вы можете просто сделать это:
mysql> select * from regextest where int_number between 1 and 50;
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
| 2 | 1 | 1 |
| 3 | 35 | 35 |
| 4 | 49 | 49 |
| 5 | 50 | 50 |
+----+----------------+------------+
4 rows in set (0.00 sec)
Этот запрос будет работать хорошо, потому что он может использовать индекс, а также более удобен для чтения и обслуживания. Побеждает во всем.
person
Asaph
schedule
03.12.2010