powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите написать запрос, pls!!
18 сообщений из 18, страница 1 из 1
Помогите написать запрос, pls!!
    #32065321
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая табличка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE logfile (
  id int( 11 ) NOT NULL auto_increment,
  remotehost varchar( 255 ) default NULL,
  rfc931 varchar( 64 ) default NULL,
  authuser varchar( 64 ) default NULL,
  request text,
  proxystatus varchar( 30 ) default NULL,
  status int( 11 ) default NULL,
  bytes int( 11 ) default NULL,
  time float( 10 , 3 ) default NULL,
  PRIMARY KEY  (id),
  KEY user_time (rfc931,time),
  KEY time_index (time),
  KEY user_status (rfc931,status)
) TYPE=MyISAM;

В ней хранится лог-файл прокси сервера, надо его проанализировать.

Требуется получить информацию, которую, в принципе дает запрос:
Код: plaintext
SELECT remotehost, SUM(bytes), proxystatus FROM logfile GROUP BY remotehost,proxystatus

но в другом виде.
Нужно получать в одной строке: первой колонкой - remotehost, далее по порядку колонки в каждой из которых идет SUM(bytes) для данного remotehost и конкретного proxystatus (их ограниченный предопределенный набор - 13 штук).
То есть надо заполнить такую табличку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE tempstat (
  id int( 11 ) NOT NULL auto_increment,
  remotehost varchar( 255 ) default NULL,
  month_year date NOT NULL default '0000-00-00',
  TCP_HIT int( 11 ) unsigned NOT NULL default '0',
  TCP_MISS int( 11 ) unsigned NOT NULL default '0',
  TCP_REFRESH_HIT int( 11 ) unsigned NOT NULL default '0',
  TCP_REF_FAIL_HIT int( 11 ) unsigned NOT NULL default '0',
  TCP_REFRESH_MISS int( 11 ) unsigned NOT NULL default '0',
  TCP_CLIENT_REFRESH_MISS int( 11 ) unsigned NOT NULL default '0',
  TCP_IMS_HIT int( 11 ) unsigned NOT NULL default '0',
  TCP_SWAPFAIL_MISS int( 11 ) unsigned NOT NULL default '0',
  TCP_NEGATIVE_HIT int( 11 ) unsigned NOT NULL default '0',
  TCP_MEM_HIT int( 11 ) unsigned NOT NULL default '0',
  TCP_DENIED int( 11 ) unsigned NOT NULL default '0',
  TCP_OFFLINE_HIT int( 11 ) unsigned NOT NULL default '0',
  NONE int( 11 ) unsigned NOT NULL default '0',
  PRIMARY KEY  (id),
  KEY id (id)
) TYPE=MyISAM;

Как это сделать? Уже столько времени убил, а не получается! :(

p.s. на поле month_year внимание не обращайте, его заполнение - другой вопрос.
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32065341
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял все поля TCP_xxx это результат функции SUM если поле proxystatus в таблице logfile=xxx

Можно так попробовать:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT a.remotehost,
SUM(IF(proxystatus= "xxx1" ,a.bytes, 0 )) as TCP_xxx1,
SUM(IF(proxystatus= "xxx2" ,a.bytes, 0 )) as TCP_xxx2,
...
SUM(IF(proxystatus= "xxxn" ,a.bytes, 0 )) as TCP_xxxn
FROM logfile a
GROUP BY a.remotehost


или так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT a.remotehost,
SUM(b_1.byte) as TCP_xxx1,
SUM(b_2.byte) as TCP_xxx2,
...
SUM(b_n.byte) as TCP_xxxn,
FROM logfile a, logfile b_1, logfile b_2, logfile b_n
WHERE
a.id=b_1.id AND a.id=b_2.id AND ... AND a.id=b_n.id
AND
b_1.proxystatus= "xxx1"  AND b_2.proxystatus= "xxx2"  AND ... AND b_n.proxystatus= "xxxn" 

GROUP BY a.remotehost
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32065420
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ААААААААА !! Заработало!
Первый вариант работает, второй не проверял еще.

СПАСИБО!
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32065423
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот чтука прикольная - конференция! Человек гору времени убил, а ему за 15 минут ответ дали :)
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32066000
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, спасибо еще раз.

А у меня еще вот вопрос есть -
как в этом запросе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT
        a.remotehost,
        SUM(IF(proxystatus= "TCP_HIT" ,a.bytes, 0 )) as TCP_HIT,   
        SUM(IF(proxystatus like '%HIT',a.bytes, 0 )) as HIT_TOTAL,
        SUM(IF(proxystatus not like '%HIT',a.bytes, 0 )) as MISS_TOTAL,
        SUM(bytes) as BYTES_TOTAL
FROM logfile_day a
GROUP BY a.remotehost

сделать еще одну колонку в которой, к примеру, вычисляется отношение суммы полученной в третьей колонке (%HIT) к сумме в последней колонке (таким образом хочу получить эффективность кэширования для конкретного хоста)?
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32066011
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
        a.remotehost,
        SUM(IF(proxystatus= "TCP_HIT" ,a.bytes, 0 )) as TCP_HIT,   
        SUM(IF(proxystatus like '%HIT',a.bytes, 0 )) as HIT_TOTAL,
        SUM(IF(proxystatus not like '%HIT',a.bytes, 0 )) as MISS_TOTAL,
        SUM(bytes) as BYTES_TOTAL,

        (SUM(IF(proxystatus like '%HIT',a.bytes, 0 ))/SUM(bytes)) as hit_ratio

FROM logfile_day a
GROUP BY a.remotehost
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32066014
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, вот так... но это понятно, я то думал можно как-то использовать полученное в первых колонках (не зря же мы их обзываем "AS ...").
:)

Впрочем наверное там какая-то оптимизация есть и дважды он одно и тоже не считает, так?
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32066015
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
        a.remotehost,
        SUM(IF(proxystatus= "TCP_HIT" ,a.bytes, 0 )) as TCP_HIT,   
        SUM(IF(proxystatus like '%HIT',a.bytes, 0 )) as HIT_TOTAL,
        SUM(IF(proxystatus not like '%HIT',a.bytes, 0 )) as MISS_TOTAL,
        SUM(bytes) as BYTES_TOTAL,

        (HIT_TOTAL/BYTES_TOTAL) as hit_ratio

FROM logfile_day a
GROUP BY a.remotehost


Так тожно можно но Алиасы не всегда работают как нгадо или вообще не работают! А в MySQL тем более. Хотя с 4.x может уже все будет в ажуре!
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32066035
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я так пробовал - ни фига :(
не работают алиасы
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32066036
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я и говорю, что в 3.x точно не работает! Но может в 4.x заработает!
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068404
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему когда я цепляюсь через ODBC, то запрос
Код: plaintext
1.
2.
3.
4.
SELECT [clients].[fullname], (Sum([logfile_month].[bytes])/ 1048576 ) AS [Sum-Mbytes], [logfile_month].[rfc931]
FROM logfile_month INNER JOIN clients ON [logfile_month].[rfc931]=[clients].[user]
WHERE ((([logfile_month].[request]) Not Like '%metra%') And (([logfile_month].[proxystatus]) Not Like '%HIT' And ([logfile_month].[proxystatus]) Not Like '%DENIED'))
GROUP BY [clients].[fullname], [logfile_month].[rfc931]
ORDER BY [logfile_month].[rfc931];

работает в Access'e, а когда я то же самое делаю на самом сервере (через phpMyAdmin), то ругается на неправильный синтаксис? :(((
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068418
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо полагать потому, что MySQL не понимает "[" и "]" на зато он понимает одинарные кавычки '
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068421
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я пробовал просто убрать квадратные скобки - не помогает. Неужели надо все их заменить на ' ? Или достаточно только в нескольких местах?
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068425
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При именование полей и таблиц нельзя забывать про зарезервированные слова! Именно по этой причине Access добавил [ ] скобки а MySQL понимает тоже самое в апострофах! Но нет смысла менять их на апострофы достаточно просомтреть на предмет синтаксиса :) и зарезервированных слов! Ща гляну... На первый взгляд - все ОК!
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068426
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так сработало:
Код: plaintext
1.
2.
3.
4.
SELECT clients.fullname, (Sum(logfile_month.bytes)/ 1048576 ) AS `Sum-Mbytes`, logfile_month.rfc931
FROM `logfile_month` INNER JOIN clients ON logfile_month.rfc931=clients.user
WHERE (((logfile_month.request) Not Like '%metra%') And ((logfile_month.proxystatus) Not Like '%HIT' And (logfile_month.proxystatus) Not Like '%DENIED'))
GROUP BY clients.fullname, logfile_month.rfc931
ORDER BY logfile_month.rfc931;

А есть разница между ' и ` ?
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068429
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что это за символы такие?!

Что-то мне вспомнилось что MySQL не совсем корректно INNER JOIN обрабатывает!

Но
INNER JOIN clients ON logfile_month.rfc931=clients.user
тоже что и
FROM
logfile_month, clients
WHERE
logfile_month.rfc931=clients.user


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT
clients.fullname,
(Sum(logfile_month.bytes)/ 1048576 ) AS Sum-Mbytes,
logfile_month.rfc931

FROM
logfile_month, clients
WHERE
logfile_month.rfc931=clients.user
AND
logfile_month.request Not Like '%metra%'
AND
logfile_month.proxystatus Not Like '%HIT'
logfile_month.proxystatus Not Like '%DENIED'

GROUP BY clients.fullname, logfile_month.rfc931
ORDER BY logfile_month.rfc931;
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068432
Nickolay Matveyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что это за символы такие?!
Я не понял вопроса :)
' - Одинарная кавычка
` - Этот не знаю как называется, у меня на той же клавише, что и тильда "~". Просто его часто вставляет phpMyAdmin, когда сам запросы генерит, вот я его и попробовал использовать.

А что значит не совсем корректно INNER JOIN обрабатывает ? У меня вроде бы выдает правильные результаты. Или в один прекрасный день может не сработать? :) Поясни pls.
...
Рейтинг: 0 / 0
Помогите написать запрос, pls!!
    #32068453
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да на самом деле информация непроверенная. Там MySQL до какой-то версии подглюкивал с INNER JOIN потому как им никто не пользовался наверное... но щас с этим все ок! Одним словом если версия новая, то не безпкойся! Там еще от типа таблиц зависит тоже многое!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите написать запрос, pls!!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]