Делая некоторые вычисления в MySQL, номера отключаются при использовании GROUP BY - PullRequest
1 голос
/ 27 мая 2011

Я выполняю следующий запрос, чтобы получить статистику для пользователя, на основе которой я им плачу.

SELECT hit_paylevel, sum(hit_uniques) as day_unique_hits
       , (sum(hit_uniques)/1000)*hit_paylevel as day_earnings
       , hit_date 
FROM daily_hits 
WHERE hit_user = 'xxx' AND hit_date >= '2011-05-01' AND hit_date < '2011-06-01' 
GROUP BY hit_user

Таблица выглядит следующим образом:

CREATE TABLE IF NOT EXISTS `daily_hits` (
  `hit_itemid` varchar(255) NOT NULL,
  `hit_mainid` int(11) NOT NULL,
  `hit_user` int(11) NOT NULL,
  `hit_date` date NOT NULL,
  `hit_hits` int(11) NOT NULL DEFAULT '0',
  `hit_uniques` int(11) NOT NULL,
  `hit_embed` int(11) NOT NULL,
  `hit_paylevel` int(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`hit_itemid`,`hit_date`),
  KEY `hit_user` (`hit_user`),
  KEY `hit_mainid` (`hit_mainid`,`hit_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Проблема в расчете связана с hit_paylevel, который действует как множитель. По умолчанию один, другой вариант 2 или 3, который по сути удваивает или утраивает прибыль за этот день.

Если я повторяю циклы по дням, ежедневная day_earnings верна, просто, когда я группирую их, она вычисляет все как уровень оплаты 1. Это происходит, если в начале у пользователя был уровень оплаты 1, а позже он был обновлен до более высокий уровень. если пользователь имеет уровень оплаты 2 с самого начала, он также рассчитывает все правильно.

Ответы [ 2 ]

1 голос
/ 27 мая 2011

Как @Denis сказал:

Измените запрос на

SELECT hit_paylevel, sum(hit_uniques) as day_unique_hits
       , sum(hit_uniques * hit_paylevel) / 1000 as day_earnings
       , hit_date 
FROM daily_hits 
WHERE hit_user = 'xxx' AND hit_date >= '2011-05-01' AND hit_date < '2011-06-01' 
GROUP BY hit_user;

Почему это решает проблему
Выполнение hit_paylevel снаружи сумма, сначала суммирует все hit_uniques, а затем выбирает случайное hit_paylevel, чтобы умножить ее на
Не то, что вы хотите.Если вы сделаете оба столбца в сумме, MySQL объединит правильные значения hit_uniques и hit_paylevels.

Опасности группы по
Это важная вещь, о которой следует помнить.MySQL.
Предложение group by отличается от других баз данных.
На MSSQL * (или Oracle или PostgreSQL) вы получили бы ошибку

Неагрегированное выражение должно появиться вgroup by clause

Или слова на этот счет.

В вашем исходном запросе hit_paylevel не в совокупности (сумме) и также не впредложение group by, поэтому MySQL просто выбирает значение случайным образом.

1 голос
/ 27 мая 2011

Разве это не должно быть sum(hit_uniques * hit_paylevel) / 1000?

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