在PHP中对SQL结果集进行分组

时间:2012-07-27 20:53:36

标签: php sql arrays loops

假设我有一个查询运行以下查询:

修改

添加了order子句,因为真正的sql语句有一个。

SELECT description, amount, id FROM table ORDER BY id

在这种情况下,ID不是数据集唯一的。它会返回这样的东西。

    Description    Amount    ID
    -----------    ------    --
1    Hats            45       1
2    Pants           16       1
3    Shoes           3        1
4    Dogs            5        2
5    Cats            6        2
6    Waffles         99       3

我需要做的是将每个ID部分包含在它自己的div中(所以在一个div中有1,2,3行,在另一个div中有4,5,在它自己的div中有6个)。

有很多解决方案,但我想不出一个不太复杂的解决方案。

我希望能够保持SQL的工作方式并以某种方式对PHP中的数据集进行排序,这样我就可以循环遍历数据集的每个部分,同时循环遍历数据集。

某种阵列会起作用,但它的结构让我很难受。

我怎样才能让它发挥作用? PHP解决方案是理想的,但理论也会有所帮助。

4 个答案:

答案 0 :(得分:4)

看看这样的东西是否适合你。

// execute query: Select description, amount, id from table

$results = array();

while ($row = $query_result->fetch_array()) {
    if (!isset($results[$row['id']])) $results[$row['id']] = array();
    $results[$row['id']][] = $row;  // push $row to results for this id
}

// later on
foreach($results as $id => $data) {
    // output div based on $id
    foreach($data as $datum) {
        // output individual data item that belongs to $id
    }
}

答案 1 :(得分:3)

简单的串行解决方案可能如下所示:

$curId = '';       // track working id
$firstDiv = true;  // track if inside first div

// open first div
echo '<div>';

// foreach $row
{
    // when id changes, transition to new div, except when in first div
    if ($row->$id != $curId) {
        if ($firstDiv) {
            $firstDiv = false;
        } else {
            // start new div
            echo '</div>';
            echo '<div>';
        }
        $curId = $row->$id;  // track new current id
    }

    // display contents of current row
}

// close last div
echo '</div>';

答案 2 :(得分:1)

只需将id存储在temp变量中,如果下一个不同,请关闭div并打开新div

答案 3 :(得分:1)

假设db结果的关联数组:

$final = array();

foreach($results as $result)
{
    $final[$result['id']][] = $result;
}

这将为您留下一个关联数组$final,它按ID

对条目进行分组