我有以下MySQL查詢(timestamp
是在Unix時間,很明顯):累積總和
SELECT usr_id, CONCAT(YEAR(FROM_UNIXTIME(timestamp)), "/", MONTH(FROM_UNIXTIME(timestamp)), "/", DAY(FROM_UNIXTIME(timestamp))) as date_stamp
FROM table
ORDER BY YEAR(FROM_UNIXTIME(timestamp)), MONTH(FROM_UNIXTIME(timestamp)), DAY(FROM_UNIXTIME(timestamp));
這產生這樣的事情:
$arr = array(
array('usr_id'=>3, 'date_stamp'=>'2011/6/6'),
array('usr_id'=>2, 'date_stamp'=>'2011/6/20'),
array('usr_id'=>2, 'date_stamp'=>'2011/6/20'), // same id and date as above
array('usr_id'=>5, 'date_stamp'=>'2011/6/20'), // same date as above
array('usr_id'=>1, 'date_stamp'=>'2011/6/21'),
array('usr_id'=>4, 'date_stamp'=>'2011/6/21'), // same date as above
array('usr_id'=>2, 'date_stamp'=>'2011/6/21'), // same date as above...
//... and same id as a day before
);
我願把它弄成這個樣子:
$arr = array(
array('sum'=>1, 'date_stamp'=>'2011/6/6'),
array('sum'=>3, 'date_stamp'=>'2011/6/20'), // +2 as one of the 3...
//... for this date was a duplicate
array('sum'=>5, 'date_stamp'=>'2011/6/21'), // +2 as one of the 3...
//... was already there on a different day
);
這就是我TR IED,但我後來才意識到,這只是照顧唯一的給定日期,而不是整個陣列,因爲我想讓它做的事:
$sum = 0;
$tempRes = array();
$result = array();
$date = null;
foreach($arr as $row)
{
$date = $row['date_stamp'];
if (!in_array($row['usr_id'], $tempRes))
$tempRes[$date][] = $row2['usr_id'];
}
foreach ($tempRes as $date2 => $ids)
{
$sum += count($ids);
$result[] = array($date2, $sum);
}
基本目的是要產生的次數的累積總和usr_id
的每天,並確保相同usr_id
只在整個陣列中計爲一個,即。按天排序的唯一usr_id
累計總和。
如果你有更好的優化MySQL查詢的想法,那就是歡迎了。
編輯:我想「累積」發生在整個陣列上,而不僅僅是每天,如我的示例輸出,即。 1天1,2天3(1 + 2),3天5(3 + 2)......等
您是否總是希望在最早日期(或特定日期)計算的ID,並且您是否試圖避免將數據兩次傳遞? – DaveCoast
@DaveCoast重要的是它按日期升序排序,並且我希望在任何日期已經使用的id被省略。 – webeno
看到一個優雅的解決方案將是有趣的。我必須分兩步完成:查詢分組ID和最短日期,然後用PHP中的運行總數來統計ID。 – DaveCoast