MySQL/PHP:如何分组列出结果,但限制所需的DB查询

MySQL/PHP:如何分组列出结果,但限制所需的DB查询,php,mysql,grouping,Php,Mysql,Grouping,我的数据库如下: --------------------------------------------------------------- | module_name | category | content | --------------------------------------------------------------- | module1 | category1 |

我的数据库如下:

---------------------------------------------------------------
|       module_name      |     category    |       content    |
---------------------------------------------------------------
|       module1          |     category1   |       content    |
|       module2          |     category1   |       content    |
|       module3          |     category2   |       content    |
|       module4          |     category3   |       content    |
|       module5          |     category2   |       content    |
---------------------------------------------------------------
我希望能够创建结果组,但在不嵌套MySQL查询的情况下,无法找到最快速、最有效的方法。结果应如下所示(忽略样式):

我的代码如下所示:

$query  = 'SELECT'
        . ' DISTINCT'
        . ' category AS name'
        . ' FROM #__table'
        . ' WHERE enabled = 1';
$db->setQuery($query);
$categories = $db->loadObjectList();
foreach ($categories as $category) {
$query  = 'SELECT'
    . ' module_name'
    . ' FROM #__table'
        . ' WHERE enabled = 1 AND category = \'' . $category->name . '\''
        . ' ORDER BY id';                       
    $db->setQuery($query);
    $results = $db->loadObjectList();
foreach ($results as $result) {
        echo $result->module_name;
    }
}

这是一个有效的嵌套查询,但有更好的方法吗?

一种方法是查询数据库中按类别排序的所有行,然后在PHP中将它们分组到单独的表中。您可以迭代跟踪类别中的更改并直接输出到HTML的行,或者构建一个嵌套数组结构,反映组的结构和每个组中的行,然后使用该结构来呈现HTML

  • 按类别对记录集进行排序 列(然后按模块名称)
  • 循环浏览您的记录集,保持 跟踪您所在的类别 ($当前类别)
  • 当行的类别不存在时 匹配$current\u类别,则开始 新分组
  • 更具体地说,调整代码:

    $query  = 'SELECT'
            . ' module_name, category'
            . ' FROM #__table'
            . ' WHERE enabled = 1 '
            . ' ORDER BY category, id';                                               
    $db->setQuery($query);
    $results = $db->loadObjectList();
    
    $current_category = null;
    foreach ($results as $result) 
    {
        if ($current_category != $result->category)
        {
            // whatever you do to separate the category listings
            //  if you don't do it before the first, check ($current_category != null)
    
            $current_category = $result->category
        }
        echo $result->module_name;
    }
    

    对我来说,它看起来像是在3个表中布置数据模式,而不是一个包含3列和多行的表。在这个场景中:


    加入表格并按类别对结果进行分组。

    只需使用数组即可。除非你的数据集是巨大的

    foreach($results as $result)
        //assuming $result is an associative array
        $sorted_results[$result['category']][] = $result;
    }
    
    //now you can do fun stuff like
    foreach($sorted_results as $category => $category_result_list) {
        //do something meaningful
    }
    
    编辑:刚刚看到您的代码示例

    foreach($results as $result)
        //assuming $result is an associative array
        $sorted_results[$result['category']][] = $result;
    }
    
    //now you can do fun stuff like
    foreach($sorted_results as $category => $category_result_list) {
        //do something meaningful
    }