У меня есть следующая схема (две таблицы):
**APPS** | ID (bigint) | USERID (Bigint) | USAGE_START_TIME (datetime) | ------------------------------------------------------------------ | 1 | 12 | 2013-05-03 04:42:55 | | 2 | 12 | 2013-05-12 06:22:45 | | 3 | 12 | 2013-06-12 08:44:24 | | 4 | 12 | 2013-06-24 04:20:56 | | 5 | 13 | 2013-06-26 08:20:26 | | 6 | 13 | 2013-09-12 05:48:27 | **USAGE** | ID (bigint) | APPID (bigint) | DEVICEID (bigint) | HIGH_COUNT (bigint) | MEDIUM_COUNT (bigint) | -------------------------------------------------------------------------------------------------------- | 1 | 1 | 2 | 400 | 200 | | 2 | 1 | 3 | 200 | 100 | | 3 | 2 | 3 | 350 | 40 | | 4 | 3 | 4 | 2 | 400 | | 5 | 4 | 2 | 4 | 30 | | 6 | 5 | 3 | 50 | 300 |
Объяснение:
Итак, есть две таблицы. Теперь я хочу найти следующее:
Учитывая USERID, получите сумму HIGH_COUNT & MEDIUM_COUNT. При подсчете SUM следует позаботиться о том, чтобы: Если в ИСПОЛЬЗОВАНИИ одно и то же устройство используется более одного раза, то при вычислении суммы следует учитывать запись, которая имеет самую последнюю информацию (на основе APPS.USAGE_START_TIME).
Например:
Для вышеприведенной схемы результат должен быть (для userid = 12):
| HIGH_COUNT (bigint) | MEDIUM_COUNT (Bigint) | ----------------------------------------------- | 356 | 470 |
SQL Fiddle: http://sqlfiddle.com/#!2/74ae0f
Если пользователь использует несколько APPS
на одном устройстве, этот запрос будет использовать строку APPS
с самым высоким значением usage_start_time
:
select a.userid , sum(u.high_count) , sum(u.medium_count) from apps a join `usage` u on u.appid = a.id join ( select u.device_id , a.userid , max(a.usage_start_time) as max_start_time from apps a join `usage` u on u.appid = a.id group by u.device_id , a.userid ) filter on filter.device_id = u.device_id and filter.userid = a.userid and filter.max_start_time = a.usage_start_time group by a.userid
В вашем наборе данных он будет выбирать строки использования 5, 3, 4
для пользователя 12
.
Посмотрите, как работает SQL Fiddle.
Я не могу получить ваши номера, но что-то вроде этого должно работать …
SELECT a.userid , SUM(u.high_count) , SUM(u.medium_count) FROM apps a JOIN `usage` u ON u.appid = a.id JOIN ( SELECT userid , deviceid , MAX(usage_start_time) max_usage_start_time FROM apps a JOIN `usage` u ON u.appid = a.id GROUP BY userid , deviceid ) x ON x.userid = a.userid AND x.deviceid = u.deviceid AND x.max_usage_start_time = a.usage_start_time GROUP BY userid;
Обратите внимание, что usage
является зарезервированным словом. Поэтому это плохое имя для столбца (или таблицы). Также обратите внимание на несоответствия между вашим вопросом и вашей скрипкой.
Я думаю, что у меня не было возможности проверить это, но
SELECT SUM(HIGH_COUNT), SUM(MEDIUM_COUNT) FROM `USAGE` INNER JOIN `APPS` ON USAGE.APPID=APPS.ID WHERE APPS.USERID=$input_user_id_to_lookup
даст вам ваш счет.
Для yoru другого вопроса (домашнее задание?) Вы не дали нам полную схему, поэтому мы не можем догадаться, что вам нужно делать.
Также тот, кто проектировал этот db, должен был застрелить его ужасным