Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение статистики пользователей 
V
    Опции темы
aktuba
  Дата 12.10.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Друзья, снова нуждаюсь в Вашей помощи.
Есть две таблицы:

Таблица пользователей:
Код

1. id
2. login


Таблица статистики:
Код

1. user_id
2. dt (дата, тип DATE)
3. param_1
4. param_2
5. param_3
6. param_4


Задача: получить таблицу за определенные даты (dt_1, dt_2, dt_3, dt_4, ...) с сортировкой по каждому столбцу
Код

1. login
2. SUM(param_1)
3. SUM(param_2)
4. SUM(param_3)
5. SUM(param_4)


Искренне надеюсь на Вас, т.к. у самого никак не получается =(


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Gluttton
Дата 12.10.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



В Вашем же предыдущем посте в этой ветке писал Gudinya...
Код

select
    users.login,
    (select sum(statistic.param_1) from statistic inner join users on statistic.user_id=users.id) as param_1,
    ...
    (select sum(statistic.param_N) from statistic inner join users on statistic.user_id=users.id) as param_N
from users
    order by users.login, param_1, ... , param_N


Что то вроде такого...
На сервере не проверял...

В-у-у-упс smile про даты забыл smile ...
Сравнение с датами помещается в подзапросы...
Код

select
    users.login,
    (select sum(statistic.param_1) from statistic inner join users on statistic.user_id=users.id where statistic.dt between d1 and d2) as param_1,
    ...
    (select sum(statistic.param_N) from statistic inner join users on statistic.user_id=users.id where statistic.dt between d1 and d2) as param_N
from users
    order by users.login, param_1, ... , param_N


Это сообщение отредактировал(а) Gluttton - 12.10.2009, 22:40


--------------------
Слава Україні!
PM MAIL   Вверх
aktuba
Дата 12.10.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Я про это уже думал, но... Какова будет нагрузка такого запроса, учитывая что в WHERE будет IN?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 12.10.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



А зачем столько подзапросов-то? зачем вообще подзапросы?
Код

select users.login
     , sum(statistic.param_1) as sum1
     , sum(statistic.param_2) as sum2
     , sum(statistic.param_3) as sum3
     , sum(statistic.param_4) as sum4
     , sum(statistic.param_5) as sum5
from statistic 
inner join users 
on statistic.user_id=users.id 
where statistic.dt in (dt_1, dt_2, dt_3)
order by sum1, sum2, sum3, sum4, sum5

Если же СУБД не поддерживает сортировку по вычисляемым значениям, то
Код

select q.*
from 
(
select users.login
     , sum(statistic.param_1) as sum1
     , sum(statistic.param_2) as sum2
     , sum(statistic.param_3) as sum3
     , sum(statistic.param_4) as sum4
     , sum(statistic.param_5) as sum5
from statistic 
inner join users 
on statistic.user_id=users.id
where statistic.dt in (dt_1, dt_2, dt_3)
) as q
order by q.sum1, q.sum2, q.sum3, q.sum4, q.sum5



Это сообщение отредактировал(а) Akina - 12.10.2009, 22:59


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gluttton
Дата 12.10.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(aktuba @  12.10.2009,  22:48 Найти цитируемый пост)
Я про это уже думал, но... Какова будет нагрузка такого запроса, учитывая что в WHERE будет IN?

Ну... Этого я не знаю, т.к. я теоретик smile ...
Но, как говориться, какая будет такая и будет...

Используйте OLAP smile , недавно сам для себя открыл такую штуку...

Теперь по сути, какие я вижу (теоретические smile ) способы оптимизировать запрос:
1. То что будет в IN вынести в CTE, если их поддерживает СУБД, тогда запрос на IN будет выполнен однажды и помещен во временную таблицу.
2. Не использовать IN, а (если позволяет логика приложения) заменить его на BETWEEN, и тогда связывание таблиц производить не сразу, а после SELECT ... BETWEEN - это позволить существенно (а может и не существенно) уменьшить сумарную таблицу, которая будет построена в результате соединения.

Ну это так... Теоретически smile ...

А что запрос на практике медленно работает?

Добавлено @ 23:09
Akina, ччерт... Всё гениальное - просто smile ...

Но по моему не хватает group by...

Добавлено @ 23:11
Хм... А если добавить group by, то запрос вернет сумму по всем пользователям вместе, а не по отдельности...

Добавлено @ 23:12
Akina, выходит твой запрос не подходит (теоретически smile ) ...


Бр-р-р, что то я запутался...

Но без group by работать не будет - забадай меня комар!

Это сообщение отредактировал(а) Gluttton - 12.10.2009, 23:14


--------------------
Слава Україні!
PM MAIL   Вверх
aktuba
Дата 13.10.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Akina, спасибо огромное! Но... Так возвращает только тех пользователей, у которых есть статистика =(. А как получить всех пользователей? Пусть у них вместо статы будет 0 или NULL. Буду очень благодарен...


Цитата(Gluttton @  13.10.2009,  00:02 Найти цитируемый пост)
Но без group by работать не будет - забадай меня комар!


GROUP BY login спасет ;)

P.S.: все время забываю указывать бд - mysql 5.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Gluttton
Дата 13.10.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(aktuba @  13.10.2009,  00:10 Найти цитируемый пост)
А как получить всех пользователей? Пусть у них вместо статы будет 0 или NULL. Буду очень благодарен...

Заменить внутреннее соединение на внешнее левое или правое (inner join на left join или right join) ...
Для приведенного прмера Akina нужно правое...

Это сообщение отредактировал(а) Gluttton - 13.10.2009, 00:26


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 13.10.2009, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Gluttton @  13.10.2009,  00:02 Найти цитируемый пост)
не хватает group by...

угу. когда пишешь в окне форума - запросто можно что-нить упустить.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aktuba
Дата 13.10.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



Цитата(Gluttton @  13.10.2009,  01:13 Найти цитируемый пост)
Заменить внутреннее соединение на внешнее левое или правое (inner join на left join или right join) ...
Для приведенного прмера Akina нужно правое...


Не помогает =(


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Zloxa
Дата 13.10.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(aktuba @  13.10.2009,  12:25 Найти цитируемый пост)
Цитата(Gluttton @  13.10.2009,  01:13 )
Заменить внутреннее соединение на внешнее левое или правое (inner join на left join или right join) ...
Для приведенного прмера Akina нужно правое...

Не помогает =( 

в добавок к ранее озвученному:
предикат "statistic.dt in (dt_1, dt_2, dt_3)"
перенести из where в join
Код

select users.login
     , sum(statistic.param_1) as sum1
     , sum(statistic.param_2) as sum2
     , sum(statistic.param_3) as sum3
     , sum(statistic.param_4) as sum4
     , sum(statistic.param_5) as sum5
from statistic 
right join users 
on statistic.user_id=users.id 
    and statistic.dt in (dt_1, dt_2, dt_3)
group by users.login
order by sum1, sum2, sum3, sum4, sum5



Это сообщение отредактировал(а) Zloxa - 13.10.2009, 12:42


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
aktuba
Дата 13.10.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



О! Теперь вроде работает! Всем thx и плюсы.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.