Php 如何正确排序数据库结果

Php 如何正确排序数据库结果,php,Php,我被要求发布一个关于如何正确排序数据的新问题。这就是我要做的。我想对我的数据库进行一次访问,以获取此页面所需的所有数据。一旦从数据库返回数据,我就需要对其进行排序并使用它 为了简洁起见,我只发布了一行数据。实际上,返回了8行。以下是正在返回的数据的结构: col1 col2 col3 col4 col5 col6 col7 col8 col9 现在,我有个问题。第1列到第7列包含1:1的数据集。但是,第8列和第9列包含许多行,因此总共包含8行。因

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

为了简洁起见,我只发布了一行数据。实际上,返回了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

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

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

或者:
像现在一样获取所有行,并使用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:
其他选项可能是存储过程或视图,但我没有足够的经验为您提供它们的良好示例,尤其是视图(甚至不确定视图是否可以用于这些目的)


但是,我想存储过程的好处是只需访问数据库一次。

好的,所以问题是,您希望如何使用这些数据?如果您希望以这种方式显示,每辆车一行,则获取连接的数据并进行检查是有意义的:

foreach ($row as $vehicle) {
    echo "$vehicle[vehicle] … $vehicle[dealerId]\n";
}
每个检索到的行将代表一组相关数据

如果,OTOH,连接的车辆数据实际上不必与dealerid等有太多关系,那么在单独的查询中检索这两个内容就更有意义了。它可能也更快


首先,以最简单的方式检索(并存储)数据,这样您就可以在PHP代码中尽可能少地进行后期处理。不要将目标设置为“在一个查询中检索所有内容”,仅仅因为。如果您担心多次访问数据库会太贵,那么它们可能不会太贵。您的时间比发出第二个请求所需的一秒钟要宝贵得多。

您能再往后退一步,发布您的表结构、真实数据的示例行以及您正在使用的查询吗?“第8列和第9列包含许多行”本身没有多大意义。您必须首先确定您想要的输出格式。您的表结构旨在返回重复数据。这取决于你如何处理它。您可以在循环中使用组或条件。但首先你必须决定你想要什么输出格式。在这种情况下,group_concat对我不起作用。Deceze已经让我梦想过了Deceze,我在这个项目的保密协议下,我不能发布任何实际的数据或表结构,但如果你愿意,我可以发布一些接近的内容。你可能需要分组讨论一些内容,但如果没有更多信息,很难说出来。fireeyedboy,谢谢。这正是我想做的,但不确定这是否正确,甚至是最好的处理方法。@jim:我最近开始更多地依赖于多个查询。我曾经认为一次数据库访问是更好的选择,但是当结果集变大时,我不确定这是否非常有效,因为我需要PHP来解析它。我现在考虑这种过早的优化,因此只需要更多的旅行到数据库,直到它真正开始影响执行时间。更多的trip通常比我给你的凌乱(IMO)PHP示例可读性更好。所以我想建议你考虑一下这对你来说有多重要,一次完成这一切,以及它是否真的有益。好吧,我实际上同意你的观点,因为你是对的,这个例子很混乱,但我也是这么做的。在可能的情况下,我总是尽量减少一些负载时间。事实上,我很高兴有另一个人认为,也许访问数据库几次并不是一件坏事。我的意思是,看看你的例子,我基本上有相同的东西,我有100多行代码试图把所有东西都带回到我可以实际使用的东西中。这真的很糟糕,正是它让我寻找更好的方法或最佳实践的原因。我刚刚阅读了你的编辑,fireeyedboy,我目前正在使用一个存储过程。您能告诉我您所考虑的存储过程的逻辑吗?我不是这方面的专家,但我可以坚持自己的观点。存储过程的问题是一次不能返回超过一行。@jim:我认为如果您担心性能,您应该对这个杂乱的示例进行一点基准测试,并多次访问数据库。我想你可能会惊讶于它所起的作用如此之小。见鬼,如果后者更快,我甚至不会感到惊讶对我必须再次完全同意你的观点,因为我一直在努力找出最快的方法。Fireeyedboy还提出了一些建议