SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.07.2010 00:50:52

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Сложное форматирование данных колонки

Здравствуйте.
Поставили задачу написать анализатор трафика. Сроки, как водится, "вчера".
До этого никогда не имел дела с MySQL, пришлось осваивать, и был удивлен, что за пару дней научился составлять довольно сложные для меня запросы. Однако, есть задача, которую я точно без вас не решу.
Словом, есть таблица log, в ней столбец host, содержащий записи такого вида:
+------------------------------+
| host                                 |
+------------------------------+
| static.baza.farpost.ru         |
| baza.farpost.ru                  |
| static.baza.farpost.ru         |
| ophelia.farpost.ru              |
| csht.ru                             |
| csht.ru                             |
| www.google-analytics.com |
| cshi.ru                             |
| www.google-analytics.com |
| 85.54.157.62                    |
| www.restricted.ru              |
| www.restricted.ru              |
| www.restricted.ru              |
+-----------------------------+

Требуется: если запись - IP - шник, ничего с ней не делать. В противном случае найти в записи последнюю точку и захватить всё что справа от неё до конца и всё что слева от неё до предыдущей точки или до начала строки (если предыдущей точки нет)

Словом, на выходе должно получиться следующее:

+------------------------------+
| smth                                 |
+------------------------------+
| farpost.ru                          |
| farpost.ru                          |
| farpost.ru                          |
| farpost.ru                          |
| csht.ru                             |
| csht.ru                             |
| google-analytics.com         |
| cshi.ru                             |
| google-analytics.com        |
| 85.54.157.62                   |
| restricted.ru                     |
| restricted.ru                     |
| restricted.ru                     |
+-----------------------------+

Буду очень благодарен за помощь. Без вас мне не справиться.

Неактивен

 

#2 18.07.2010 09:14:21

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Re: Сложное форматирование данных колонки

Решил так:

Код:

SELECT IF(host RLIKE '^[0-9]+.[0-9]+.[0-9]+.[0-9]+$',host, SUBSTRING_INDEX(host, '.', -2)) FROM log;

Это грамотно?

Неактивен

 

#3 19.07.2010 11:07:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Сложное форматирование данных колонки

Угу, можно еще воспользоваться функцией преобразования адресов ipv4:

Код:

mysql> select inet_aton('1.2.3.4'), inet_aton('blah.ru');
+----------------------+----------------------+
| inet_aton('1.2.3.4') | inet_aton('blah.ru') |
+----------------------+----------------------+
|             16909060 |                 NULL |
+----------------------+----------------------+
1 row in set (0.00 sec)

Неактивен

 

#4 20.07.2010 03:33:32

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Re: Сложное форматирование данных колонки

paulus

Спасибо )

Неактивен

 

#5 20.07.2010 07:41:15

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Re: Сложное форматирование данных колонки

А можно решить такую задачу:

Задать двухмерный массив:

Иванов 192.168.0.1
Петров 192.168.0.2
Сидоров 192.168.0.3
....

в таблице есть колонка:

+------------------------------+
| client_ip                             |
+------------------------------+
| 192.168.0.2                      |
| 192.168.0.1                      |
| 192.168.0.2                      |
| 192.168.0.2                      |
| 192.168.0.1                      |
| 192.168.0.1                      |
| 192.168.0.3                      |
| 192.168.0.3                      |
+-----------------------------+

И написать такой запрос, чтоб вместо IP-шников подставлялось имя юзера, т.е. должно получиться
+------------------------------+
| smth                                  |
+------------------------------+
| Петров                               |
| Иванов                               |
| Петров                               |
| Петров                               |
| Иванов                              |
| Иванов                              |
| Сидоров                            |
| Сидоров                            |
+-----------------------------+

Решение нужно на чистом MySQL, не PHP

Неактивен

 

#6 20.07.2010 10:46:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Сложное форматирование данных колонки

Можно smile

SELECT tablename.*, array.smth
FROM tablename, array
WHERE tablename.client_ip = array.client_ip

Неактивен

 

#7 20.07.2010 14:34:19

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Re: Сложное форматирование данных колонки

Спасибо.
А собственно создание массива можете продемонстрировать?

Неактивен

 

#8 20.07.2010 14:49:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Сложное форматирование данных колонки

CREATE TABLE array (client_ip VARCHAR(15) CHARSET latin1, smth VARCHAR(30)); ?

Неактивен

 

#9 20.07.2010 16:36:58

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Re: Сложное форматирование данных колонки

ааа.. ) ну да)) спасибо )

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson