【发布时间】:2016-04-21 20:58:22
【问题描述】:
我有以下 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
);
这是我尝试过的,但后来我才意识到它只关注给定日期的唯一性,而不是我打算做的整个数组:
$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 重要的是它按日期升序排序,我希望省略已在任何日期使用的 id。
-
看到一个优雅的解决方案会很有趣。我必须分两步完成,查询分组 ID 和最小日期,然后用 PHP 中的运行总数计算 ID。
-
@DaveCoast 日期已经排序,我想挑战是,至少对我来说,不仅要在特定日期内有效地取出 id 的重复项,而且要在整个结果堆栈中取出......
-
是的,但是使用
MIN(date)您只能在最早的日期获得一次 ID,这不是我们想要的吗?