【问题标题】:MySQL/PHP: How to list results in groups but limit the DB queries requiredMySQL/PHP:如何在组中列出结果但限制所需的数据库查询
【发布时间】:2009-12-19 00:12:15
【问题描述】:

我有一个数据库如下:

---------------------------------------------------------------
|       module_name      |     category    |       content    |
---------------------------------------------------------------
|       module1          |     category1   |       content    |
|       module2          |     category1   |       content    |
|       module3          |     category2   |       content    |
|       module4          |     category3   |       content    |
|       module5          |     category2   |       content    |
---------------------------------------------------------------

我希望能够创建结果组,但如果不嵌套 MySQL 查询,我无法找出最快、最有效的方法。结果应如下所示(忽略样式):

---------------------------------------------------------------
|       module1         |     category1    |       content    |
|       module2         |     category1    |       content    |
---------------------------------------------------------------

---------------------------------------------------------------
|       module3         |     category2    |       content    |
|       module5         |     category2    |       content    |
---------------------------------------------------------------

---------------------------------------------------------------
|       module4         |     category3    |       content    |
---------------------------------------------------------------

我的代码如下:

$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 mysql grouping


    【解决方案1】:
    1. 按类别对记录集进行排序 列(然后是 module_name)。
    2. 遍历您的记录集,保持 跟踪您所在的类别 ($current_category)。
    3. 当行的类别不 匹配 $current_category,你开始一个 新分组。

    更具体地说,调整您的代码:

    $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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在我看来,您将数据方案布置在 3 个表中,而不是 1 个具有 3 个列和多行的表。在这种情况下:

        加入您的表格并将您的结果按类别分组。

        【讨论】:

          【解决方案4】:

          只需使用一个数组。除非您的数据集非常庞大。

          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
          }
          

          编辑:刚刚看到您的代码示例

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-24
            • 2012-02-16
            • 2020-04-06
            • 2017-06-21
            相关资源
            最近更新 更多