如何将每周数据作为数组返回到按周分组的mysql查询中?

时间:2014-04-05 05:23:43

标签: mysql group-by

以下是我的数据,您可以在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);

关键是他们在同一周。

任何帮助?

2 个答案:

答案 0 :(得分:1)

你可以做什么,

select 
week(day) as Week,
year(day) Year,
group_concat(val) as val
from yourtable
group by week(day)

这会将常用val与逗号分隔分组合并到一周。

您可以检索这些数据并根据需要使用。

如果您需要全部作为一行,那么您只需选择所有没有任何分组的记录,然后它们都将显示为一行。

http://sqlfiddle.com/#!2/82a51/14

答案 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应该易于构建,或者在检索单个行时直接执行此操作而不是首先检索行数。