以下是我的数据,您可以在sqlfiddle进行测试:
CREATE TABLE yourtable
(`day` datetime, `val` int)
;
INSERT INTO yourtable
(`day`, `val`)
VALUES
('2012/01/01', 465),
('2012/01/02', 896),
('2012/08/15', 678),
('2012/09/01', 324),
('2012/12/02', 74),
('2012/12/03', 65),
('2012/12/04', 35)
;
我尝试查询所有数据并希望它们以数组rows
返回,该数组按周分组,我的代码是:
select *, week(day) Week,
year(day) Year
from yourtable
group by week(day), year(day)
不幸的是,它没有按预期工作,我希望输出如下:
rows[0]= first two records (as a array, such that I can get them by `rows[0][0]` and so on);
rows[1]=the next one record (as a array);
rows[2]=the next one record (as a array);
rows[3]=the next three records(as a array);
关键是他们在同一周。
任何帮助?
答案 0 :(得分:1)
你可以做什么,
select
week(day) as Week,
year(day) Year,
group_concat(val) as val
from yourtable
group by week(day)
这会将常用val
与逗号分隔分组合并到一周。
您可以检索这些数据并根据需要使用。
如果您需要全部作为一行,那么您只需选择所有没有任何分组的记录,然后它们都将显示为一行。
答案 1 :(得分:1)
由于MySQL没有像Oracle那样的任何数组类型(或至少没有GROUP BY聚合器来创建),我会使用
SELECT *, WEEK(day) Week,
YEAR(day) Year
FROM yourtable
ORDER BY year(day), week(day)
并在检索结果时构建数组,每当当前行中Week和Year的值与前一行不同时创建一个新行。 Query on sqlfiddle
为了让您了解如何进行分组,这是用于对行进行分组的示例PHP代码:
$plain_result = Array(
Array('day' => '2012-01-01 00:00:00', 'val' => 465, 'Week' => 1, 'Year' => 2012),
Array('day' => '2012-01-02 00:00:00', 'val' => 896, 'Week' => 1, 'Year' => 2012),
Array('day' => '2012-08-05 00:00:00', 'val' => 678, 'Week' => 33, 'Year' => 2012)
);
$grouped_result = Array();
$previousWeek = null;
$previousYear = null;
foreach ($plain_result as $row) {
if($previousWeek != $row['Week'] || $previousYear != $row['Year'] || count($grouped_result) == 0) {
$previousWeek = $row['Week'];
$previousYear = $row['Year'];
$grouped_result[] = Array();
}
$grouped_result[count($grouped_result) - 1][] = $row;
}
var_dump($grouped_result);
$plain_result
应该易于构建,或者在检索单个行时直接执行此操作而不是首先检索行数。