PHP Mysql группировать по дате из накопленных - PullRequest
0 голосов
/ 21 января 2011

У меня есть таблица с ID, value1, value2, value3 и tstamp (формат TIMESTAMP), и я пытаюсь сгруппировать по каждому дню и найти итоговую сумму за каждый день, однако все значения являются накопительными, что создает проблему,потому что сумма (значение1) не дает правильного вывода, это мой код:

$sql = "select date(tstamp), sum(".$column.") from mash group by date(tstamp) order by tstamp asc limit 10";
$result = mysql_query($sql);
$previous = 0;
$firstRun = true;
while($row = mysql_fetch_array($result))
{
  $difference = $row[1] - $previous;
  if (!$firstRun)
  {
     $strXML .= "<set name='".$row[0]."' value='".$difference."' color='AFD8F8' />";
   }
  $previous = $row[1];
  $firstRun = false;
}

Может кто-нибудь заметить проблему в этом коде, она не содержит ошибок, она просто дает неправильные ответы.

РЕДАКТИРОВАТЬ:

Чтобы устранить любую путаницу, это SQL:

 --------------------------------------------------------

--
-- Table structure for table `mash`
--

CREATE TABLE IF NOT EXISTS `mash` (
  `id` int(25) NOT NULL AUTO_INCREMENT,
  `steam` int(25) NOT NULL,
  `bore_water` int(25) NOT NULL,
  `boiler1oil` int(25) NOT NULL,
  `boiler2oil` int(25) NOT NULL,
  `tstamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5362 ;

--
-- Dumping data for table `mash`
--

INSERT INTO `mash` (`id`, `steam`, `bore_water`, `boiler1oil`, `boiler2oil`, `tstamp`) VALUES
(2, 436, 73, 15, 1, '2010-11-25 12:28:03'),
(3, 495, 74, 36, 1, '2010-11-25 12:38:04'),
(4, 553, 76, 58, 1, '2010-11-25 12:48:09'),
(5, 565, 77, 74, 1, '2010-11-25 12:58:05'),
(6, 584, 79, 78, 1, '2010-11-25 13:08:05'),
(7, 630, 82, 100, 1, '2010-11-25 13:18:11'),
(8, 686, 86, 130, 1, '2010-11-25 13:28:07'),
(9, 740, 89, 151, 1, '2010-11-25 13:38:07'),
(10, 780, 93, 173, 1, '2010-11-25 13:48:13'),
(11, 883, 100, 218, 1, '2010-11-25 14:08:10');

Ответы [ 3 ]

1 голос
/ 21 января 2011

Предполагая, что я правильно читаю вашу таблицу, вы ищете последнюю запись "value1" (или value2 и т. Д.), Которая в действительности является суммой (судя по вашему упоминанию о накопительных значениях)

+----+------+---------------------+
| id | val  | tstamp              |
+----+------+---------------------+
|  6 |    1 | 2010-01-02 01:00:00 |
|  7 |    4 | 2010-01-02 02:00:00 |
|  8 |    6 | 2010-01-02 03:00:00 |
|  9 |   15 | 2010-01-02 04:00:00 |
| 10 |   20 | 2010-01-02 05:00:00 | <-- this value
| 11 |    1 | 2010-01-03 01:00:00 |
| 12 |    4 | 2010-01-03 02:00:00 |
| 13 |    6 | 2010-01-03 03:00:00 |
| 14 |   15 | 2010-01-03 04:00:00 |
| 15 |   20 | 2010-01-03 05:00:00 | <- this value
|  1 |    2 | 2010-02-01 01:00:00 |
|  2 |    8 | 2010-02-01 02:00:00 |
|  3 |   16 | 2010-02-01 03:00:00 |
|  4 |   32 | 2010-02-01 04:00:00 |
|  5 |   64 | 2010-02-01 05:00:00 | <- this value
+----+------+---------------------+

Тогда вы сможете использовать MAX & DATE:

SELECT    DATE(tstamp), MAX(val)
FROM      mash
GROUP     DATE(tstamp)
ORDER BY  tstamp ASC;

, который будет производить:

+--------------+----------+
| DATE(tstamp) | MAX(val) |
+--------------+----------+
| 2010-01-02   |       20 |
| 2010-01-03   |       20 |
| 2010-02-01   |       64 |
+--------------+----------+
0 голосов
/ 21 января 2011

Ключевой частью вашего вопроса является не часть GROUP BY, которая будет работать просто отлично, это то, что вы подразумеваете под накоплением.

Если вы имеете в виду, что в определенном столбце отслеживается общее количество осадков в году за каждый день (т. Е. Число продолжает расти, поскольку дельта между двумя записями - это фактический дождь, который произошел в этот день), то что вам нужно сделать, это сначала избавиться от дельты. SQL будет немного сложным, независимо от того, как вы это сделаете, поэтому вам, вероятно, лучше делать это на PHP, но здесь я пытаюсь использовать SQL.

create temporary table foo select * from bar;

create temporary table non_accumulative
select b.id, b.rain - f.rain as "rain", rain_timestamp from bar b join foo f on (f.id + 1) = b.id;

select sum(rain), date(rain_timestamp) from non_accumulative group by date(rain_timestamp) order by rain_timestamp;

Конечно, вы можете сделать то же самое с вложенными выборками, но я считаю, что временные таблицы работают быстрее.

0 голосов
/ 21 января 2011

Если вы группируете по дате, она будет группироваться по наименьшему приращению даты.Вы должны быть сгруппированы по дням даты.Что-то вроде:

select DATE_FORMAT(tstamp, '%Y-%m-%c') as ymd, sum(".$column.") from mash group by ymd order by tstamp asc limit 10

, который даст вам формат даты и месяца, по которому он будет группироватьсяЕсли вам нужен доступ к значениям года, месяца и дня по отдельности, выполните:

select YEAR(tstamp) as year, MONTH(tstamp) as month, DAY(tstamp) as day, sum(".$column.") from mash group by year, month, day order by tstamp asc limit 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...