Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Поставили задачу написать анализатор трафика. Сроки, как водится, "вчера".
До этого никогда не имел дела с 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)); ?
Неактивен
ааа.. ) ну да)) спасибо )
Неактивен