Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

mysql, использование оператора like (Дмитрий Эсс)
Author Message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sun Sep 14, 2003 5:39 pm ()
   Post subject: mysql, использование оператора like
Reply with quote

Проблема такая... Надо без помощи регов выбрать все поля, значения которых начинаются не с буквы и не с цифры. Как же не хочется перечислять все возможные символы.

Регом это делается элементарно, но ужасно долго. Существуют ли в like обозначения групп символов, например все латинские буквы и все цифры (в регах это будет [:alnum:])? В документации я ничего по этому вопросу не нашёл.

Если не существует, то есть ещё одна догадка, как это сделать. Можно ли в mysql вкладывать друг в друга такие операторы как like, between или in? Если да то, нельзя ли пример, как это делается? Я имею ввиду что-то вроде этого:
Code (SQL): скопировать код в буфер обмена
NOT LIKE IN(CONCAT(BETWEEN 'a' AND 'z','%'),CONCAT(BETWEEN '' AND '','%'),CONCAT(BETWEEN '0' AND '9','%'))
Без комментариев, этот код приведён просто, чтобы показать, что примерно мне надо, на работоспособность он не претендует.

Может кто-нибудь сталкивался с такой проблемой.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sun Sep 14, 2003 8:35 pm (спустя 2 часа 56 минут)
   Post subject:
Reply with quote

Дмитрий Эсс:
А not like на что ?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sun Sep 14, 2003 9:18 pm (спустя 43 минуты)
   Post subject:
Reply with quote

yUAC:
1)
Дмитрий Эсс wrote:
Надо без помощи регов выбрать все поля, значения которых начинаются не с буквы и не с цифры.
2)
Дмитрий Эсс wrote:
Без комментариев, этот код приведён просто, чтобы показать, что примерно мне надо, на работоспособность он не претендует.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sun Sep 14, 2003 9:23 pm (спустя 4 минуты)
   Post subject:
Reply with quote

Или я тебя не правильно понял?
not - т.к. нужно всё, кроме букв и цифр
like - т.к. нужны не поля, чьи значения не равны буквам и цифрам, а поля, чьи значения начинаются не с буквы и не с цифры.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Sep 15, 2003 4:09 pm (спустя 18 часов 45 минут)
   Post subject:
Reply with quote

Дмитрий Эсс:
Code (SQL): скопировать код в буфер обмена
NOT LIKE 'выражение'
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Mon Sep 15, 2003 4:23 pm (спустя 14 минут)
   Post subject:
Reply with quote

yUAC:
Я это прекрасно знаю. Я и спрашибал, можно ли вкладывать операторы. В данном случае это вложение in в like.
А можно чего-нибудь по существу?.. А то работа стоит.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Sep 15, 2003 4:27 pm (спустя 4 минуты)
   Post subject:
Reply with quote

Дмитрий Эсс wrote:
А то работа стоит.
А что мешает регами-то сделать, я чего-то не понимаю...
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Mon Sep 15, 2003 4:42 pm (спустя 14 минут)
   Post subject:
Reply with quote

yUAC:
Я проверял, скорость каждого запроса при использовании регов вместо like уменьшается где-то в 10 раз.
Back to top
View user's profile Send private message Send e-mail
DmitriyPopov
Участник форума



Joined: 10 Mar 2003
Posts: 1491
Карма: 22
   поощрить/наказать


PostPosted: Wed Sep 17, 2003 11:59 am (спустя 1 день 19 часов 17 минут)
   Post subject:
Reply with quote

Дмитрий Эсс:
Нельзя. Если уж совсем приспичило, то можно тупо:
Code (SQL): скопировать код в буфер обмена
NOT LIKE 'a%'
AND NOT LIKE 'b%'
AND NOT LIKE 'c%'
AND NOT LIKE 'd%'
AND NOT LIKE 'e%'
AND NOT LIKE 'f%'
AND NOT LIKE 'g%'
Но это уж очень тупо...
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Wed Sep 17, 2003 4:21 pm (спустя 4 часа 22 минуты)
   Post subject:
Reply with quote

Дмитрий Попов:
Ну спасибо, наконец-то короткий и точный ответ. Попробую перечислить все нецифробуквенные (или как их там называют) символы Вашим способом. Замерю время исполнения такого запроса и через реги. Потом напишу, что оказалось эффективнее.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Sep 17, 2003 5:05 pm (спустя 43 минуты)
   Post subject:
Reply with quote

Дмитрий Эсс:
Попробуй сформулировать задачу.

Обычно такие извращения требуются при некорректной постановке задачи.
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Wed Sep 17, 2003 7:05 pm (спустя 1 час 59 минут)
   Post subject:
Reply with quote

WingedFox:
Вре всё объяснил в первом сообщении, ну да ладно...
Короче, надо вытащить из БД все записи, в которых значение определённого поля начинается не с букв (ни с латинских, ни с русских) и не с цифр.
Ответ на возможный вопрос: реги работают раз в 8-10 медленне, чем с помощью like. Замерял профайлером.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Sep 17, 2003 7:17 pm (спустя 11 минут)
   Post subject:
Reply with quote

Вот именно это я и подразумеваю под "неправильно поставленной задачей".

Зачем отталкиваться от варианта, который потребует заведомо больше операций?
Почему бы не выбрать те поля, которые начинаются с определенных символов?

Кстати, приведи пример регов - у меня замедление составляет менее 50%
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Wed Sep 17, 2003 7:35 pm (спустя 17 минут)
   Post subject:
Reply with quote

Ну да перебрал, я протестировал ещё раз.
Code (SQL): скопировать код в буфер обмена
REGEXP '^(the)? $letter'
в 5 раз медленнее, чем
Code (SQL): скопировать код в буфер обмена
LIKE 'the $letter%' OR m.art LIKE '$letter%'
А задача поставлена правильно, я сделал навигацию по буквам в архиве на своём mp3 сайте, там идут все цифры, потом все русские и латинские буквы, потом знак #, он означает всё, что не попало под перечисленные символы. Я для этого пользовался таким регом:
Code (SQL): скопировать код в буфер обмена
 
Но он, как я уже сказал, медленный.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Sep 17, 2003 7:45 pm (спустя 10 минут)
   Post subject:
Reply with quote

Так для таких выборок индексы и придумали =)
Сделай поле с первым символом из записи, построй по нему индекс.
При внесении в базу если запись начинается не с цифры и не с буквы, то заноси в это поле ту же самую #.
При вытаскивании - выбырай все по этой решетке. Будет много быстрее.

Кстати, этот рег действительно тормозной. Попробуй прямое перечисление /^[^a-zа-я0-9]/
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Wed Sep 17, 2003 8:02 pm (спустя 16 минут)
   Post subject:
Reply with quote

WingedFox:
Спасибо, честно говоря такое решение мне не пришло в голову. Действительно, скорость будет о-го-го, а места на диске займёт по минимуму.
Вот что значит мало опыта.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Sep 17, 2003 8:06 pm (спустя 4 минуты)
   Post subject:
Reply with quote

Дмитрий Эсс:
На здоровье! :)

"Правильная постановка задачи - половина ее решения" (с) чей-то
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Sep 23, 2003 4:06 am (спустя 5 дней 8 часов 46 секунд)
   Post subject:
Reply with quote

Вариантов масса. Например:
Code (SQL): скопировать код в буфер обмена
SELECT * FROM tbl WHERE LEFT(FIELD, 1) NOT BETWEEN 'a' AND 'z'
Плюс создать индекс по данному столбцу (тип колонки char(N), даже не varchar!) длиной в 1 символ. Должно работать очень быстро.

А можно, кажется, и вообще так, без всяких LEFT-ов:
Code (SQL): скопировать код в буфер обмена
SELECT * FROM tbl WHERE FIELD NOT BETWEEN concat('a', char(0)) AND concat('z', char(255))
Тогда сравниваться будет лексикографически. Не уверен, правда, что это получится быстрее.

См. www.mysql.com/doc/en/Comparison_Operators.html
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Tue Sep 23, 2003 4:29 pm (спустя 12 часов 22 минуты)
   Post subject:
Reply with quote

Дмитрий Котеров:
Спасибо, но я уже сделал отдельную колонку с первой буквой и индекс по ней. Работает гораздо быстрее.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Sep 23, 2003 10:19 pm (спустя 5 часов 49 минут)
   Post subject:
Reply with quote

Зато теперь придется все время думать, как бы не забыть эту колонку обновить. Если б MySQL держал триггеры, тогда бы это была не проблема.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Tue Sep 23, 2003 10:23 pm (спустя 4 минуты)
   Post subject:
Reply with quote

Дмитрий Котеров:
База данных создаётся в Fox Pro и при экспорте в mysql эта колонка автоматичести заполняется.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML