如何正确排序数据库结果

时间:2010-03-07 07:09:35

标签: php

我被要求发布一个关于如何正确排序数据的新问题。这是我想要做的。我想在我的数据库中单独访问此页面所需的所有数据。一旦我从数据库返回数据,我需要对其进行排序并使用它。

为简洁起见,我只发布一行数据。实际上,返回了8行。以下是要返回的数据的结构:

col1    col2    col3    col4    col5    col6    col7    col8    col9

现在,这是我遇到的问题。第1列到第7列包含1:1数据集。然而,第8列和第9列保持多行,因此总共8行。因为我将第1列到第7列与1:M行混合在一起,所以我对第1-7行的回应比我需要的要多7倍。

我该如何解决这个问题?


我想补充一点,在这个查询中使用了4个内部联接。其中一个表保存了我只需要访问一次的页面特定数据。其他连接是创建其他行的内容。我只想说这个结果集的输出是绝对正确的。我只需要弄清楚如何对它进行排序。


好的,这应该有意义......

dealerId  empId  lotId  rackId  porterId  vehicle  vin
1         1      1      1       1         Geo      12JI997676JH
1         1      1      1       1         Ford     87HJ879854HS
1         1      1      1       1         BMW      567876HCS456
1         1      1      1       1         Mercedez 1JI8787GS687

在这个集合中,请注意我有4行重复数据。我需要的是:

dealerId  empId  lotId  rackId  porterId
1         1      1      1       1

然后对于多行,我需要这个:

vehicle  vin
Geo      12JI997676JH
Ford     87HJ879854HS
BMW      567876HCS456
Mercedez 1JI8787GS687

因此,此设置现在为我提供了经销商数据的行,现在我有了一个包含车辆数据的新阵列。 :)

2 个答案:

答案 0 :(得分:1)

我知道的两个选项(并使用,取决于我期望数据集的大小)。

或者:
像现在一样获取所有行,并使用php对其进行排序,例如:

$result = array();
foreach( $rowset as $row )
{
    // if the parent row is not present in the result array (assuming col1 is PK)
    if( !isset( $result[ $row[ 'col1' ] ) )
    {
        // create it, and make arrays of col8 and col9
        $result[ $row[ 'col1' ] ] = array(
            'col1' => $row[ 'col1' ],
            'col2' => $row[ 'col2' ],
            'col3' => $row[ 'col3' ],
            'col4' => $row[ 'col4' ],
            'col5' => $row[ 'col5' ],
            'col6' => $row[ 'col6' ],
            'col7' => $row[ 'col7' ],
            'col8' => array( $row[ 'col8' ] ),
            'col9' => array( $row[ 'col9' ] )
        )
    }
    else
    {
        // the parent row is present, so push values in col8 and col9 arrays
        $result[ $row[ 'col1' ] ][ 'col8' ][] = $row[ 'col8' ];
        $result[ $row[ 'col1' ] ][ 'col9' ][] = $row[ 'col9' ];
    }
}

或者:
首先选择未连接的行,然后通过这些行循环并为它们选择子行,从而更多地访问数据库。

所以,总结一下:如果你真的只想要一次DB,那么第一个选项是唯一可用的选项(据我所知)。

<强> PS:
其他选项可能是存储过程或视图,但我没有足够的经验来为它们提供很好的示例,尤其是视图(甚至不能确保视图可以用于这些目的)。

但我认为存储过程的好处是单次访问数据库。

答案 1 :(得分:1)

好的,问题是,你想如何使用这些数据?如果你想以这种方式显示它,每辆车一行,获取JOINed数据是有意义的,只需通过它:

foreach ($row as $vehicle) {
    echo "$vehicle[vehicle] … $vehicle[dealerId]\n";
}

每个检索到的行将代表一组相关数据。

如果OTOH,JOINed车辆数据实际上不需要对dealerIds等做太多,那么在单独的查询中检索这两件事就更有意义了。它也可能更快。

以最简单的方式检索(并存储,开始)数据,这样您就必须尽可能少地在PHP代码中进行后按摩。不要将目标设置为“在单个查询中检索所有内容”,因为。如果你担心几次访问数据库太昂贵,他们可能不会。 您的时间比发出第二次请求的瞬间更有价值。