Сумма строк с объединением - PullRequest
1 голос
/ 05 октября 2011

MySQL problem

Это текущий макет таблицы.

  • Есть 3 ноги
  • У каждой ноги есть 2 точки, где is_start = 1 - начало ноги, а is_start - конец ноги.
  • Когда пользователь регистрируется в точке, создается запись в points_user.

В этом приложении у вас есть несколько ног, у которых есть 2 точки, где одна отмечает начало ноги, а другая - конец ноги. Таким образом, сумма ноги пользователя (с id = 2) (с id = 1) составляет points_users. created, где points_users. leg_id = 1 и points_users. user_id = 2 и points_users . is_start = 0 минус points_users, где is_start = 1 (а остальные параметры остаются прежними). И это только для одной ноги.

Я хотел бы сложить все разницы во времени для каждого этапа, и мы получим следующие данные:

| User.id | User.name | total_time |
| 1       | John      | 129934     |

Кто-нибудь знает, как я могу присоединиться к этим таблицам и сгруппировать их по группам?

(Нет, это не домашняя работа)

Насколько я получил:

SELECT
( `end_time` - `start_time` ) AS `diff`
FROM
(
    SELECT SUM(UNIX_TIMESTAMP(`p1`.`created`)) AS `start_time`
    FROM `points_users` AS `pu1`
    LEFT JOIN `points` AS `p1` ON `pu1`.`point_id` = `p1`.`id`
    WHERE `p1`.`is_start` = 1
) AS `start_time`,
(
    SELECT SUM(UNIX_TIMESTAMP(`pu2`.`created`)) AS `end_time`
    FROM `points_users` AS `pu2`
    LEFT JOIN `points` AS `p2` ON `pu2`.`point_id` = `p2`.`id`
    WHERE `p2`.`is_start` = 0
) AS `end_time`

Ответы [ 2 ]

0 голосов
/ 05 октября 2011

Попробуйте это:

select users.user_id,
    users.user_name,
    SUM(timeDuration) totalTime
from users
join (
    select 
        pStart.User_id,
        pStart.leg_id,
        (pEnd.created - pStart.created) timeDuration                
    from (select pu.user_id,  pu.leg_id,  pu.created
        from points_users pu
        join points p on  pu.id = p.point_id and pu.leg_id = p.leg_id
        where p.is_start = 1 ) pStart
    join  (select pu.user_id, pu.leg_id,  pu.created
        from points_users pu
        join points p on  pu.id = p.point_id and pu.leg_id = p.leg_id
        where p.is_start = 0 ) pEnd
    on      pStart.user_id = pEnd.user_id
    and     pStart.leg_id = pEnd.leg_id
    ) tt
on users.user_id = tt.user_id
group by users.user_id, users.user_name

Подзапрос получает продолжительность времени для каждого пользователя / участка, а основной запрос затем суммирует их для всех участков каждого пользователя.

0 голосов
/ 05 октября 2011

EDIT: добавлена ​​таблица points, теперь я вижу вашу попытку запроса.

Самый простой способ - присоединить points_users к себе:

select leg_start.user_id, sum(leg_end.created - leg_start.created)
from points_users leg_start
join points_users leg_end on leg_start.user_id = leg_end.user_id
    and leg_start.leg_id = leg_end.leg_id
join points point_start on leg_start.point_id = point_start.id
join points point_end on leg_end.point_id = point_end.id
where point_start.is_start = 1 and point_end.is_start = 0
group by leg_start.user_id

Некоторые люди предпочитают помещать эти is_start фильтры в условие соединения, но, поскольку это внутреннее соединение, это в основном просто точка стиля. Если бы это было внешнее соединение, то перемещение их из WHERE в JOIN могло повлиять на результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...