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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединение двух таблиц + SUM, MySQL v5 
V
    Опции темы
PriZraK
Дата 3.9.2008, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

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



Здравствуйте. 
Не хватает знаний создать запрос с объединением двух таблиц, а так же суммированием информации. База данных MySQL пятой версии.

В таблице первой («user_info») хранится информация о пользователях — IP-адрес, тарифный план, статус и время последнего обновления информации.
Код

user_ip, user_router, user_status, last_update


Во второй таблице («user_traffic») содержится информация о Интернет-сессиях пользователя — IP-адрес, трафике и времени добавления сессии в базу данных.
Код

user_ip, user_ext_traff_in, user_ext_traff_out, user_int_traff_in, user_int_traff_out, last_insert


От SQL-запроса требуется объединить эти две таблицы, вывести список IP-адресов пользователей, а напротив них суммы по каждому виду трафика. Так же необходима возможность указывать временные рамки (тип временных полей «datetime»).
PM MAIL ICQ Skype GTalk   Вверх
Deniz
Дата 3.9.2008, 07:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Код
select user_ip, sum(user_ext_traff_in), sum(user_ext_traff_out), sum(user_int_traff_in), sum(user_int_traff_out)
from user_traffic
where last_insert between "date1" and "date2"
group by user_ip



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
PriZraK
Дата 3.9.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

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



Цитата(Deniz @ 3.9.2008,  07:08)
Код
select user_ip, sum(user_ext_traff_in), sum(user_ext_traff_out), sum(user_int_traff_in), sum(user_int_traff_out)
from user_traffic
where last_insert between "date1" and "date2"
group by user_ip

Моя невнимательность — забыл указать необходимость полей user_router, user_status из первой таблицы напротив каждого из пользователей, именно по этому речь шла о объединении таблиц.

Это сообщение отредактировал(а) PriZraK - 3.9.2008, 19:41
PM MAIL ICQ Skype GTalk   Вверх
skyboy
Дата 3.9.2008, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



т.е. ты не можешь приведенный запрос дополнить inner join?
PM MAIL   Вверх
PriZraK
Дата 3.9.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

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



Цитата(skyboy @ 3.9.2008,  20:51)
т.е. ты не можешь приведенный запрос дополнить inner join?

Да — не могу правильно описать запрос.
PM MAIL ICQ Skype GTalk   Вверх
Deniz
Дата 4.9.2008, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Код
select i.user_router, i.user_status, t.user_info, sum( ...
from user_traffic t
  inner join user_info i on t.user_ip = i.user_ip
where last_insert between "date1" and "date2"
group by i.user_router, i.user_status, t.user_info

PS: читайте больше литературы по SQL, этот вопрос достаточно простой.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
PriZraK
Дата 5.9.2008, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

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



Код

SELECT i.user_ip, i.user_router, i.user_status, t.last_insert, 
   SUM(t.user_ext_traff_in) AS ext_traff_in, 
   SUM(t.user_ext_traff_out) AS ext_traff_out, 
   SUM(t.user_int_traff_in) AS int_traff_in, 
   SUM(t.user_int_traff_out) AS int_traff_out
FROM user_traffic t
INNER JOIN user_info i ON t.user_ip = i.user_ip
WHERE i.user_router LIKE '".$num."' AND last_insert BETWEEN '".$trafficmin."' AND '".$trafficmax."'
GROUP BY i.user_router, i.user_status, t.last_insert

Вся проблема заключалось в выводе списка вида:
    10.0.0.1, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.2, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.3, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
а получалось, подобное вашему запросу, который выдает:
    10.0.0.1, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.1, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.1, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.1, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.2, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.2, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.2, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.2, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.2, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.3, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
    10.0.0.3, ext_traff_in, ext_traff_out, int_traff_in, int_traff_out, тариф, статус
то есть в итоге мы получаем список сессий за выбранный период, а не список пользователей с количеством трафика за выбранный период. Возможно я плохо объяснил первым своим постом, что-же действительно необходимо. Возможно ли создать такой запрос? — так как были мысли уже о не возможности данной SQL операции, в итоге сделал в два запроса, которые оказались очень медленными — один из них перебирал пользователей в первой таблице, а второй уже суммировал и выводил информацию.

Это сообщение отредактировал(а) PriZraK - 5.9.2008, 03:13
PM MAIL ICQ Skype GTalk   Вверх
Akina
Дата 5.9.2008, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(PriZraK @  5.9.2008,  04:12 Найти цитируемый пост)
мы получаем список сессий за выбранный период, а не список пользователей с количеством трафика за выбранный период.

И что? трудно обернуть это в еще один суммирующий запрос?


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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



PriZraK, напиши по русски что ты хочешь получить.
Запрос группирует по описанным в select полям.
Если на один user_ip есть несколько статусов и тарифов, то вопрос какой выводить?
Можно доработать и выводить все одним запросом.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
PriZraK
Дата 12.9.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

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



Цитата(Akina @ 5.9.2008,  07:22)
И что? трудно обернуть это в еще один суммирующий запрос?

Вернулся сегодня к «своим баранам», дописал запрос — получилось.
Код

SELECT
    user_ip,
    SUM(user_ext_traff_in) AS ext_traff_in,
    SUM(user_ext_traff_out) AS ext_traff_out,
    SUM(user_int_traff_in) AS int_traff_in,
    SUM(user_int_traff_out) AS int_traff_out,
    user_router,
    user_status
FROM
    (SELECT
        i.user_ip,
        i.user_router,
        i.user_status,
        t.last_insert,
        t.user_ext_traff_in,
        t.user_ext_traff_out,
        t.user_int_traff_in,
        t.user_int_traff_out
    FROM
        user_traffic t
    INNER JOIN
        user_info i
    ON
        t.user_ip = i.user_ip
    WHERE
        i.user_router LIKE '".$num."' AND last_insert BETWEEN '".$trafficmin."' AND '".$trafficmax."'
    GROUP BY
        i.user_router, i.user_status, t.last_insert) AS new
GROUP BY
    user_ip

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


 




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


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

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