如何在由单个字段分组的列表中构建数组数组

时间:2013-09-19 01:28:04

标签: mysql cakephp

我有一张包含类似数据的项目表,如:

ItemDetails

id   name     value   item_id
1    Toy      10300   1
2    Toy2     10103   1
3    Title    One     1
4    Toy      300     2
5    Price    103     2
6    Exp      2020    2

我想使用一个使用CakePHP 2.x的find方法来读取所有数据,并按照item_id值对数组中的所有项进行分组。这是一个数组,每个元素都包含具有相同item_id的所有值的数组。所以数组看起来像:

Array
(
 [0] => Array
     (
      [0] => Array
        (
            [ItemDetail] => Array
                (
                    [id] => 1
                    [name] => Toy
                    [value] => 10300
                    [item_id] => 1
                )

        )

    [1] => Array
        (
            [ItemDetail] => Array
                (
                    [id] => 2
                    [name] => Toy1
                    [value] => 103003
                    [item_id] => 1
                )

        )

    [2] => Array
        (
            [ItemDetail] => Array
                (
                    [id] => 3
                    [name] => Title
                    [value] => One
                    [item_id] => 1
                )
        )
   )
 [1] => Array
  (

    [0] => Array
        (
            [ItemDetail] => Array
                (
                    [id] => 4
                    [name] => Toy
                    [value] => 300
                    [item_id] => 2
                )

        )

    [1] => Array
        (
            [ItemDetail] => Array
                (
                    [id] => 5
                    [name] => Price
                    [value] => 300
                    [item_id] => 2
                )


        )

    [2] => Array
        (
            [ItemDetail] => Array
                (
                    [id] => 6
                    [name] => Exp
                    [value] => 2020
                    [item_id] => 2
                )
        )
    )
)

我已经尝试了一些分组的想法,但它似乎消除了除了在表中找到的第一个字段值之外的所有字段值。我真的不想聚合数据,而是将类似item_id的所有内容组合在一起。

有人能指出我正确的方向吗?我想用一个find语句来做这个,所以我可以使用paginate。我已经设法用条件=> id =(预期的item_id列表)重复查找并从每次调用的结果构建数组。但似乎应该有更好的方法。

1 个答案:

答案 0 :(得分:0)

Sql聚合和分组将无法真正帮助您在此处执行所需操作。你需要做的是:

在查询中按item_id订购sql结果集。

类似的东西:

select id,
       name,
       value,
       item_id
from ItemDetails
order by item_id

逐步执行结果集,跟踪临时变量中的上一个item_id。当前行的item_id与前一行不匹配时,就可以开始外部数组的新元素了。

所以,比如:

$temp_item_id = -1;
$i = -1;
$result = array();
foreach($statement->fetchRow() as $row) {
    if ($row['item_id'] !== $temp_item_id) {
        ++$i;
        $result[$i] = array();
    }
    $temp_item_id = $row['item_id'];
    $result[$i][] = array('ItemDetail' => $row);
}