|  | 
Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. 
Поставили задачу написать анализатор трафика. Сроки, как водится, "вчера".
До этого никогда не имел дела с 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                     |
+-----------------------------+
Буду очень благодарен за помощь. Без вас мне не справиться.
Неактивен
Решил так:
SELECT IF(host RLIKE '^[0-9]+.[0-9]+.[0-9]+.[0-9]+$',host, SUBSTRING_INDEX(host, '.', -2)) FROM log;
Это грамотно?
Неактивен

Угу, можно еще воспользоваться функцией преобразования адресов 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)Неактивен
paulus
Спасибо )
Неактивен
А можно решить такую задачу:
Задать двухмерный массив:
Иванов 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
Неактивен

Можно 
SELECT tablename.*, array.smth 
FROM tablename, array
WHERE tablename.client_ip = array.client_ip
Неактивен
Спасибо.
А собственно создание массива можете продемонстрировать?
Неактивен

CREATE TABLE array (client_ip VARCHAR(15) CHARSET latin1, smth VARCHAR(30)); ?
Неактивен
ааа.. ) ну да)) спасибо )
Неактивен