MySQL / PHP:如何在组中列出结果但限制所需的数据库查询

时间:2009-12-19 00:12:15

标签: php mysql grouping

我有一个数据库如下:

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

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

4 个答案:

答案 0 :(得分:3)

  1. 按类别对记录集进行排序 列(然后是module_name)。
  2. 循环播放记录集,保留 跟踪您所在的类别 ($ current_category)。
  3. 当行的类别没有时 匹配$ current_category,你开始了 新的分组。
  4. 更具体地说,调整代码:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

对我来说,看起来你的数据方案是在3个表中,而不是1个表中包含3个columsn和多行。在这个scenariao:

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

答案 3 :(得分:0)

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

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
}

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