1

这与我之前发布的一个问题有关,但不幸的是,我认为我的问题表述不够清楚,因为我没有得到问题的完整答案。

我有两张表,一张叫 Groups,一张叫 Items。我想做的是选择所有组,然后在每个组中选择所有项目,所以我最终得到这样的结果:

标题 1 <- 组

  • 一个 <- 项目
  • 两个 <- 项目

标题 2 <- 组

  • 一个 <- 项目
  • 两个 <- 项目

在我的原始帖子中,您可以看到我最初用于实现此目的的代码,它本质上是一个循环内的循环,首先选择所有组,然后选择组内的所有项目。我知道在 SQL 查询循环中使用 SQL 查询循环是个坏主意,因此感谢一些有用的 SO 成员,我现在有了以下代码:

$query = "SELECT g.ID AS GRPID, g.Description AS GrpDesc,i.ID AS ITEM_ID, i.Description AS ItemDescription
              FROM Groups_Inv g
          LEFT JOIN Items_Inv i
          ON g.ID=i.grpID
          ORDER BY g.SortNum ASC";
     try { 
                $result = odbc_exec($connect,$query); 
                if($result){ 
                   while ($groups = odbc_fetch_array($result)) {

            echo    "<li title='".$groups['GrpDesc']."' class='category'>
                <h3><span><a class='category'>".$groups['GrpDesc']."</a></span></h3>
                <ul class='sub-menu'>\n";

            echo "<li class='select'>
                <input type='radio' class='addRow'>
                    <label for='".$groups['ITEM_ID']."'>
                    ".$groups['ItemDescription']."
                    </label>
                  </li>\n";

            echo    "</ul>
                </li>\n";
        }
                } 
                else { 
        throw new RuntimeException("Failed to connect."); 
                } 
    } 

这将选择具有相应项目的所有组,但它不会将所有项目分组在其组标题下,因此我最终得到如下结果:

标题 1

标题 1

如何修改它,以便所有组仅列出一次,并且每个组的所有项目都正确列出在组标题下?

4

1 回答 1

1

如果您在此代码中遇到问题,请告诉我。我使用单独的类进行查询。

class tank extends mysqli{
public function curr_group_content($a)
{
    $query ="SELECT g.ID AS GRPID, g.Description AS GrpDesc,i.ID AS ITEM_ID, i.Description AS ItemDescription
                    FROM Groups_Inv g
                    LEFT JOIN Items_Inv i
                    ON g.ID=i.grpID
                    ORDER BY g.SortNum ASC";  

        if ($stmt = parent::prepare($query)){
            $stmt->execute(); 
            $meta = $stmt->result_metadata();

            while ( $field = $meta->fetch_field() ) {
                $parameters[] = &$row[$field->name];
            }

           call_user_func_array(array($stmt, 'bind_result'), $parameters);

              while ( $stmt->fetch() ) {
                  $x = array();
                  foreach( $row as $key => $val ) {
                     $x[$key] = $val;
                  }
                  $results[] = $x;
               }       

           return $results;
           $stmt->close();
        }//END PREPARE
        else{trigger_error($this->error, E_USER_NOTICE);}
}
}

$clients = new tank();
$data = array();
$events = $clients->curr_group_content();
$eventscount = sizeof($events);
  for($i=0;$i<$eventscount;$i++){
    $data['item'][] = $events[$i]['item'];
  }
于 2013-09-25T14:54:31.613 回答