Сложный запрос - помогите придумать!

Sergey Martynov
Дата: 30.04.2003 16:30:36
Помогите разобраться. Нужно написать сложный запрос. Вот ситуация:

Для обработки статистики лог веб-сервера складыватся в табличку, после чего с помощью хитрых запросов формируется таблица со статистикой.
Вот такой запрос это делает:

INSERT INTO server_day SELECT '$YESTERDAY'::date as date,
req_url,
count(*) as reqs,count(DISTINCT host_ip) as hosts
FROM stat_tmp WHERE date(vers)='$YESTERDAY'::date
GROUP BY req_url ;

Видно, что считается статистика хитов и хостов.

Теперь надо дописать такую фичу: в таблице stat_tmp есть есть поле login, в котором для каждого запроса хранится логин пользователя, если он авторизован. В таблицу server_day я добавил поля reqs_u и hosts_u - в них нужно сложить кол-во хитов и хостов авторизованных пользователей, но не всех, а отвечающих особому критерию. Критерий можно просчитать заранее, и сделать таблицу users_tmp с одним полем - login - и в нее сложить логины нужных пользователей.

То есть задача сводится к следующей:

Написать запрос типа такого:

INSERT INTO server_day SELECT '$YESTERDAY'::date as date,
req_url,
count(*) as reqs,count(DISTINCT host_ip) as hosts,
count( ЧТО_ТО_ХИТРОЕ_1 ) as reqs_f,
count( ЧТО_ТО_ХИТРОЕ_2 ) as hosts_f
FROM stat_tmp WHERE date(vers)='$YESTERDAY'::date
GROUP BY req_url ;

надо придумать ЧТО_ТО_ХИТРОЕ_1 и ЧТО_ТО_ХИТРОЕ_2, так чтобы оно смотрело в поле login таблицы stat_tmp и выбирало только те записи, в которых login встречается в таблице users_tmp.
Niemi
Дата: 30.04.2003 18:48:10
ЧТО_ТО_ХИТРОЕ_1 и ЧТО_ТО_ХИТРОЕ_2 подразумевают subquery.
Но сначало бы немешало полное опимание таблиц:
Create Table tbl_name1 (

id_field_name11 type [constraints| primary key],
field_name21 type,
...
);

Create Table tbl_name2 (
id_field_name12 type [constraints| primary key],
field_name22 type,
...
);



"чтобы оно смотрело в поле login таблицы stat_tmp и выбирало только те записи, в которых login встречается в таблице users_tmp."
subquery:
Select a.id_field_name11,b.id_field_name12, field_name21, field_name22 from tbl_name1 a, tbl_name2  b where a.id_field_name1,b.id_field_name2;
Rin
Дата: 03.06.2003 16:26:35

--Вариант с join-ом

INSERT INTO server_day
SELECT '$YESTERDAY'::date as date, s.req_url,
count(*) as reqs,
count(DISTINCT s.host_ip) as hosts,
count(u.login) as reqs_f,
count(DISTINCT CASE WHEN u.login is not null THEN s.host_ip ELSE null END) as hosts_f
FROM stat_tmp s
LEFT OUTER JOIN users_tmp u ON u.login=s.login
WHERE s.vers::date='$YESTERDAY'::date
GROUP BY s.req_url;

--2-ой вариант

INSERT INTO server_day
SELECT '$YESTERDAY'::date as date, s.req_url,
count(*) as reqs,
count(DISTINCT s.host_ip) as hosts,
count(CASE WHEN exists(select 1 from users_tmp u where u.login=s.login limit 1) THEN s.login ELSE null END) as reqs_f,
count(DISTINCT CASE WHEN exists(select 1 from users_tmp u where u.login=s.login limit 1) THEN s.host_ip ELSE null END) as hosts_f
FROM stat_tmp s
WHERE s.vers::date='$YESTERDAY'::date
GROUP BY s.req_url;


Надо проверить, но мне больше нравиться 1-ый вариант