我被要求发布一个关于如何正确排序数据的新问题。这是我想要做的。我想在我的数据库中单独访问此页面所需的所有数据。一旦我从数据库返回数据,我需要对其进行排序并使用它。
为简洁起见,我只发布一行数据。实际上,返回了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
因此,此设置现在为我提供了经销商数据的单行,现在我有了一个包含车辆数据的新阵列。 :)
答案 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代码中进行后按摩。不要将目标设置为“在单个查询中检索所有内容”,因为。如果你担心几次访问数据库太昂贵,他们可能不会。 您的时间比发出第二次请求的瞬间更有价值。