The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Регулярные выражения в SQL запросах"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Регулярные выражения в SQL запросах"  +/
Сообщение от SubGun (ok) on 28-Июл-09, 10:30 
>можен причина и была но мне совершенно не понятен смысл выражения
>GROUP BY __регулярное выражение__

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Регулярные выражения в SQL запросах"  +/
Сообщение от Pahanivo email(ok) on 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 используется?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Регулярные выражения в SQL запросах"  +/
Сообщение от anonymous (??) on 27-Июл-09, 21:40 
Добавь ещё одну колонку в таблицу, где храни название сайта.  Да, денормализация.  Но зато и ускорение.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Регулярные выражения в"  +/
Сообщение от Andrey Mitrofanov on 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.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Регулярные выражения в"  +/
Сообщение от SubGun (ok) on 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}'

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "Регулярные выражения в"  +/
Сообщение от phpcoder email(??) on 28-Июл-09, 13:21 
>А в awk возможна ли замена по regex?

Да: sub(), gsub()


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "Регулярные выражения в"  +/
Сообщение от Andrey Mitrofanov on 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().

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

16. "Регулярные выражения в"  +/
Сообщение от SubGun (ok) on 28-Июл-09, 14:00 
Не про $9, а про $7. Примерно так: http://www.opennet.dev/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.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

:-))

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

19. "Регулярные выражения в SQL запросах"  +/
Сообщение от timsa on 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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру