SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.01.2014 14:33:02

vladimircape
Участник
Зарегистрирован: 17.01.2014
Сообщений: 1

Выборка для каждого юзера в которых сумма очков превысила число

У меня есть запрос, его цель найти время datetime когда определенный пользователь набрал дополнительный бал и общая сумма баллов к примеру превысила 100.
Вот такой запрос, но он ищет те пользователей у кого превысило, но datetime бёрет самый первы


SELECT *,(p.datetime-u.createtime)/86400 as result
    FROM tbl_user_points p
    Inner join tbl_users u ON u.id=p.user_id
    GROUP BY p.user_id
    HAVING SUM(p.points) > 100
    order by SUM(p.points)
 

вот схемата таблиц tbl_user_points

CREATE TABLE `tbl_user_points` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `action` int(10) unsigned NOT NULL,
  `description` varchar(255) DEFAULT '',
  `points` int(10) NOT NULL DEFAULT '0',
  `datetime` int(10) unsigned NOT NULL,
  `club_id` int(10) unsigned DEFAULT NULL,
  `event_id` int(10) unsigned DEFAULT NULL,
  `location_id` int(10) unsigned DEFAULT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `id_UNIQUE` (`id`)
   ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='Achieved users points for any actions.';
 

и таблицы tbl_users

CREATE TABLE `tbl_users` (
   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
   `username` varchar(255) DEFAULT NULL,
   `password` varchar(255) DEFAULT NULL,
   `email` varchar(128) NOT NULL,
   `activkey` varchar(128) NOT NULL DEFAULT '',
   `createtime` int(11) NOT NULL,
   `lastvisit` int(11) NOT NULL,
   `superuser` int(1) NOT NULL DEFAULT '0',
   `status` int(1) NOT NULL DEFAULT '1',
   `first_name` varchar(128) DEFAULT NULL,
   `last_name` varchar(128) DEFAULT NULL,
   `gender` varchar(6) DEFAULT NULL,
   `locale` varchar(45) DEFAULT NULL,
   `service` varchar(45) NOT NULL,
   `service_id` varchar(255) DEFAULT NULL,
   `location` varchar(128) DEFAULT NULL,
   `state` int(3) DEFAULT NULL,
   `photo` varchar(255) DEFAULT NULL,
   `city` varchar(125) DEFAULT NULL,
   `about_me` varchar(255) DEFAULT NULL,
   `user_code` varchar(10) DEFAULT NULL,
   `loyalty_level` varchar(45) DEFAULT 'basic' COMMENT 'Level of loyalty for current user',
   `updatetime` int(11) NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `email` (`email`),
   UNIQUE KEY `user_code_UNIQUE` (`user_code`),
   KEY `status` (`status`),
   KEY `superuser` (`superuser`)
 ) ENGINE=InnoDB AUTO_INCREMENT=1033 DEFAULT CHARSET=utf8;
 


пример входных данных tbl_user_points
 


id   |  user_id|action|description|points|       datetime
2246      1        1    First visit     5   1383331212
2254      1        2    Second visit    15  1383354853
2255      1        3    Winner          25  1383360231
2256      2        1    First visit     5   1383331202
2257      2        2    Second visit    15  1383354553
2258      2        3    Winner          25  1383360211
 

tbl_user пример пользователей

id=1,createtime=1313000000
id=2,createtime=1313000001
 

для HAVING SUM(p.points) > 15 выход должен быть   

user_id   datetime
 1           1383354853  
 2           1383354553
 

Пока для одного пользователя , работает

   

SELECT *,SUM(points) as points FROM tbl_user_points
JOIN  
  (SELECT @rn := 0 ) r
WHERE
  (@rn := @rn + points) >=20
and user_id=1681
 

но как вывести чтобы всех пользователей что превысили и время когда превысили.

Неактивен

 

#2 17.01.2014 18:20:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка для каждого юзера в которых сумма очков превысила число

Посмотрите FAQ №16
Чтобы выбрать нужное использовать max(`datetime`)

Неактивен

 

#3 17.01.2014 19:59:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка для каждого юзера в которых сумма очков превысила число

Пардон, невнимательно прочитал условие.
Обратите внимание на 3ий способ из ссылке в факе , который через пользовательские переменные http://sqlinfo.ru/forum/viewtopic.php?pid=26526#p26526

Вам нужно будет сканировать таблицу отсортированную по user_id, datetime и ловить момент, когда сумма балов превысит нужное значение.
Но в версиях > MySQL 5.6 и MariaDB 5.3 могут возникнуть сложности, см http://sqlinfo.ru/forum/viewtopic.php?id=6934

О других способах см http://webew.ru/articles/3923.webew

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson