URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8371
[ Назад ]

Исходное сообщение
"Регулярные выражения в SQL запросах"

Отправлено SubGun , 27-Июл-09 11:35 
Необходимо использовать регулярное выражение в следующем запросе:
SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
Однако статью в документации с использованием регулярных выражений я никак не осилю. Может подскажет кто?!

Содержание

Сообщения в этом обсуждении
"Регулярные выражения в SQL запросах"
Отправлено phpcoder , 27-Июл-09 11:40 
>Необходимо использовать регулярное выражение в следующем запросе:
>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__

А что за регулярное выражение, если не секрет? Другим способом никак нельзя?


"Регулярные выражения в SQL запросах"
Отправлено SubGun , 27-Июл-09 11:51 
>>Необходимо использовать регулярное выражение в следующем запросе:
>>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
>
>А что за регулярное выражение, если не секрет? Другим способом никак нельзя?
>

Регулярное выражение: ^(http://[^/]+)/.*|\1
Это лог сквида в базе, и я хочу подсчитать кол-во посещений того или иного сайта. Другой способ если и есть, то слишком гемморойный.


"Регулярные выражения в SQL запросах"
Отправлено Pahanivo , 27-Июл-09 18:09 
>>>Необходимо использовать регулярное выражение в следующем запросе:
>>>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
>>
>>А что за регулярное выражение, если не секрет? Другим способом никак нельзя?
>>
>
>Регулярное выражение: ^(http://[^/]+)/.*|\1
>Это лог сквида в базе, и я хочу подсчитать кол-во посещений того
>или иного сайта. Другой способ если и есть, то слишком гемморойный.
>

мда ... запихивать текстовые логи в базу, а потом думать как их обработать - это истинный путь самурая


"Регулярные выражения в SQL запросах"
Отправлено SubGun , 27-Июл-09 18:53 
>мда ... запихивать текстовые логи в базу, а потом думать как их
>обработать - это истинный путь самурая

Дело не в том "ЗАЧЕМ", а в том "КАК". Будьте уверены, причина была.


"Регулярные выражения в SQL запросах"
Отправлено Pahanivo , 27-Июл-09 20:06 
>>мда ... запихивать текстовые логи в базу, а потом думать как их
>>обработать - это истинный путь самурая
>
>Дело не в том "ЗАЧЕМ", а в том "КАК". Будьте уверены, причина
>была.

можен причина и была но мне совершенно не понятен смысл выражения
GROUP BY __регулярное выражение__

уж разбери тогда данные в самом запросе по простым полям, а потом уже групируй


"Регулярные выражения в SQL запросах"
Отправлено SubGun , 28-Июл-09 10:30 
>можен причина и была но мне совершенно не понятен смысл выражения
>GROUP BY __регулярное выражение__

Это кол-во посещений того или иного сайта. Обычно в логах URL имеет вид http://domain.ru/path/bla-bla-bla/ Но группировать по этому полю нельзя. Поэтому я хочу регулярным выражением сначала обрезать URL до вида http://domain.ru, а потом выполнить группировку. Обработка через перл для IP 22-й сети занимает около 10-15 минут, поэтому этот вариант неприемлем. Гораздо эффективнее написать SQL запрос, чтобы MySQL сам все обрабатывал.


"Регулярные выражения в SQL запросах"
Отправлено Pahanivo , 28-Июл-09 10:45 
>>можен причина и была но мне совершенно не понятен смысл выражения
>>GROUP BY __регулярное выражение__
>
>Это кол-во посещений того или иного сайта. Обычно в логах URL имеет
>вид http://domain.ru/path/bla-bla-bla/ Но группировать по этому полю нельзя. Поэтому я хочу
>регулярным выражением сначала обрезать URL до вида http://domain.ru, а потом выполнить
>группировку. Обработка через перл для IP 22-й сети занимает около 10-15
>минут, поэтому этот вариант неприемлем. Гораздо эффективнее написать SQL запрос, чтобы
>MySQL сам все обрабатывал.

спасибо поржал, очень  смешно ... ))
во-первых: для обрезки строк надо использовать функции работы со строкой (подстрокой), но никак не регексы
во-вторых: ты видимо не знаешь что такое регексы ибо начинаешь рассуждать еще про какието скорости )) обработка регекса это уже слишком тяжело ибо обрабатывается он совсем не так как ты это себе представляешь
во-третих: ты считаешь что читать текстовый файл напрямую с диска медленне чем делать запрос в мускуле?
в-четвертых: а в мускуле вообще случайно не PCRE используется?


"Регулярные выражения в SQL запросах"
Отправлено SubGun , 28-Июл-09 11:26 
>во-первых: для обрезки строк надо использовать функции работы со строкой (подстрокой), но
>никак не регексы

Почему же я не могу при помощи регулярных выражений отрезать часть URL?

>во-вторых: ты видимо не знаешь что такое регексы ибо начинаешь рассуждать еще
>про какието скорости )) обработка регекса это уже слишком тяжело ибо
>обрабатывается он совсем не так как ты это себе представляешь

Я говорю не про скорость работы регулярных выражений, а про кол-во запросов. Если я буду делать все через Perl, это потребует организации нескольких запросов к базе, точней несколько сотен, с учетом еще и цикла по IP. А таблица там ого-го, 1,5 млн записей только за день.

>во-третих: ты считаешь что читать текстовый файл напрямую с диска медленне чем
>делать запрос в мускуле?

Нет, не считаю, но мне удобнее хранить данные именно в базе.

>в-четвертых: а в мускуле вообще случайно не PCRE используется?

Честно говоря, не знаю.


"Регулярные выражения в SQL запросах"
Отправлено Pahanivo , 28-Июл-09 12:19 
>>во-первых: для обрезки строк надо использовать функции работы со строкой (подстрокой), но
>>никак не регексы
>
>Почему же я не могу при помощи регулярных выражений отрезать часть URL?

ну если уж полез через жопу, дак лезь тогда глубже )
мне вот чета влом
>>во-вторых: ты видимо не знаешь что такое регексы ибо начинаешь рассуждать еще
>>про какието скорости )) обработка регекса это уже слишком тяжело ибо
>>обрабатывается он совсем не так как ты это себе представляешь
>
>Я говорю не про скорость работы регулярных выражений, а про кол-во запросов.
>Если я буду делать все через Perl, это потребует организации нескольких
>запросов к базе, точней несколько сотен, с учетом еще и цикла
>по IP. А таблица там ого-го, 1,5 млн записей только за
>день.

я не предлагал связку perl-mysql, я предлагал perl-file
>>во-третих: ты считаешь что читать текстовый файл напрямую с диска медленне чем
>>делать запрос в мускуле?
>
>Нет, не считаю, но мне удобнее хранить данные именно в базе.

не ну это собстна твоя проблема ) как показала твоя же практика и именно тебе - нихрена не удобнее ))
>>в-четвертых: а в мускуле вообще случайно не PCRE используется?
>
>Честно говоря, не знаю.

вообще по уму ты бы задачу нормально изложил и свое решение, а не открывал бы топ какимто кривым запросом, ни кому не понятным


"Регулярные выражения в SQL запросах"
Отправлено SubGun , 28-Июл-09 12:34 
Спасибо. Я уже понял, что с помощью регулярных выражений в SQL мою задачу не решить. MySQL не осуществляет подстановку через регулярку, а лишь может возвращать значение истину или ложь, в зависимости от того, совпадает поле с регулярным выражением или нет. К сожалению, мне нужна была именно замена и именно с GROUP BY. Придется решать другим путем.

К сожалению, нормально эта тема изложена только на http://dev.mysql.com/doc/refman/5.0/en/regexp.html, пока не добрался туда, не понял.


"Регулярные выражения в SQL запросах"
Отправлено angra , 29-Июл-09 22:00 
>Я говорю не про скорость работы регулярных выражений, а про кол-во запросов.
>Если я буду делать все через Perl, это потребует организации нескольких
>запросов к базе, точней несколько сотен, с учетом еще и цикла
>по IP. А таблица там ого-го, 1,5 млн записей только за
>день.

Интересно думают непрограммисты, расскажи пожалуйста зачем тебе несколько сотен запросов на perl. Как по мне для этой задачи нужен всего один запрос, мог бы даже набросать пример, но любопытно сначала узнать как ты решил эту задачу.


"Регулярные выражения в SQL запросах"
Отправлено anonymous , 27-Июл-09 21:40 
Добавь ещё одну колонку в таблицу, где храни название сайта.  Да, денормализация.  Но зато и ускорение.

"Регулярные выражения в"
Отправлено Andrey Mitrofanov , 28-Июл-09 13:09 
google.ru + mysql group by regexp + ENTER Наслаждайтесь! Пока бесплатно....

...И нет, не помогает. 8-O

Нету там, судя по диаголальному взгляду, _замены_ по регэкспу. Так что --  GROUP BY  + много-много SUBSTRING_INDEX(SUBSTRING_INDEX(url,... =парсить вручную.

+ Типа, RTFM-
http://dev.mysql.com/doc/refman/5.1/en/string-functions.html...

..?
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(url,'://',':'),'/','?'),'?',1),':',-1)

И нет, SQL-я не знаю и не пользую.

---Бейсик, Rexx -- обязательная часть обучения. После семи лет выноса пробивок от перфокарт. Ученики Волшебника - парсят html.


"Регулярные выражения в"
Отправлено SubGun , 28-Июл-09 13:15 
А в awk возможна ли замена по regex? То есть, если я заношу данные через

cat /var/log/squid/access.log.0 | awk '{print "INSERT INTO access (ip,bytes,link,trans,time) VALUES(\""$3"\",\""$5"\",\""$7"\",\""$9"\",from_unixtime("$1"));"};'| mysql -D squid -u squid

Могу ли я на этом этапе обрезать адреса? Что-то типа:

cat /var/log/squid/access.log.0 | awk '{$3,$5,$7 ~ |^(http://[^/]+)/.*|\1|,$9}'


"Регулярные выражения в"
Отправлено phpcoder , 28-Июл-09 13:21 
>А в awk возможна ли замена по regex?

Да: sub(), gsub()



"Регулярные выражения в"
Отправлено Andrey Mitrofanov , 28-Июл-09 13:42 
>А в awk возможна ли замена по regex?
>cat /var/log/squid/access.log.0 | awk '{$3,$5,$7 ~ |^(http://[^/]+)/.*|\1|,$9}'

Не-а. Ж) Только порезать на части (если я правильно понял про $9):

| gawk 'BEGIN{split("3 5 7",idx)}{for (fld in idx) if( match($fld,"^([a-z]+://)?([^/]+)",ss) >0) $fld=ss[2]; print $3" "$5" "$7" "$9}'

| gawk 'function host(url, ss){if( match(url,"^([a-z]+://)?([^/]+)",ss) >0) return ss[2]; return url;} {print host($3)" "host($5)" "host($7)" "$9}'

От тех же самых substr+index match "спасает", но замена - практически на том же уровне.

+Если "повезёт" с версией _GNU_ awk-а. Кажется в районе 3.1.2 чего-то чинили в match().

---И да, чего только люди не делают, чтоб не учиться перлу. %)


"Регулярные выражения в"
Отправлено SubGun , 28-Июл-09 14:00 
Не про $9, а про $7. Примерно так: http://www.opennet.me/openforum/vsluhforumID9/8354.html

Убица мокрым веником, шоб я так жил, как вы пишете такие сложности. Кстати, глянул sub и gsub. Даже попробовал:

awk 'BEGIN    {
           str = "http://domain.ru/images/hotels/villa.jpeg"
           sub(/^(http:\/\/[^\/]+)\/.*/, "\1", str)
           print str
                                                }'

Почти все работает, кроме "\1". Не хочет распознавать эту подмену. Скорее всего потому что FreeBSD.

Просто не люблю Perl.


"Регулярные выражения в"
Отправлено Andrey Mitrofanov , 28-Июл-09 18:16 
>Убица мокрым веником, шоб я так жил, как вы пишете такие сложности.

:-))

>Кстати, глянул sub и gsub. Даже попробовал:
>awk 'BEGIN    {
>Почти все работает, кроме "\1". Не хочет распознавать эту подмену. Скорее всего

Если долго смотреть на man gawk, то можно заметить, что \1 есть только в gensub, а в sub/gsub есть только "&"... Кроме того сама gensub() -- "расширение GNU".

>потому что FreeBSD.

...веником - опять позиксвей. :-> http:/openforum/vsluhforumID9/8367.html#9


"Регулярные выражения в SQL запросах"
Отправлено timsa , 21-Сен-09 09:10 
>Необходимо использовать регулярное выражение в следующем запросе:
>SELECT COUNT(*) FROM access WHERE ip='$ipaddr' GROUP BY __регулярное выражение__
>Однако статью в документации с использованием регулярных выражений я никак не осилю.
>Может подскажет кто?!

Если domain всегда начинается с http://

SELECT SUBSTRING_INDEX( SUBSTRING( ref, 8 ) ,  '/', 1 ) AS domain, COUNT( * ) AS c FROM access GROUP BY SUBSTRING_INDEX( SUBSTRING( ref, 8 ) ,  '/', 1 ) ORDER BY c DESC