代码之家  ›  专栏  ›  技术社区  ›  hash

如何使用PHP显示行范围内的mysql数据?

  •  1
  • hash  · 技术社区  · 17 年前

    我从MySQL中获得的数据显示了客户获得的所有组织,以及每个组织中员工的所有详细信息。我只想列出每个组织的名称一次,即在一个单元格中(第span行),并将该组织中的所有员工与此名称对照,如:

    Org1     Emp1 Name, Emp1 Phone, Emp1 Address
             Emp2 Name, Emp2 Phone, Emp2 Address
    
    
    Org2     Emp1 Name, Emp1 Phone, Emp1 Address
             Emp2 Name, Emp2 Phone, Emp2 Address
    

    非常感谢。

    7 回复  |  直到 17 年前
        1
  •  4
  •   Veynom    17 年前

    经典

    $currentOrg = '';
    while ($row = mysql_fetch_object($query)) {
       if ($row->org != $currentOrg) {
          echo "$row->org".
       }
       $currentorg = $row->org;
    }
    

    不是最美,而是那么简单。

        2
  •  4
  •   Greg    17 年前
    // Get the data
    $data = mysql_query('SELECT org, emp_name, emp_phone, emp_address FROM x');
    
    // Store it all in a 2D array, keyed by org
    $rows = array();
    while ($row = mysql_fetch_assoc($data))
    {
        // Initialise each org to an empty array (not really needed in PHP but I prefer it)
        if (empty($rows[$row['org']]))
            $rows[$row['org']] = array();
    
        $rows[$row['org']][] = $row;
    }
    
    // Print it out
    foreach ($rows as $org => $employees)
    {
        print('<tr><td rowspan="' . count($employees) . '">' . htmlentities($org) . '</td>');
    
        foreach ($employees as $i => $employee)
        {
            // If $i == 0, we've already printed the <tr> before the loop
            if ($i)
                print('<tr>');
    
            print('<td>......</td></tr>');
        }
    }
    
        3
  •  0
  •   Tomalak    17 年前

    改正 rowspan ,你需要提前知道号码。

    • 迭代查询结果两次,计算值直到它们发生变化
    • 向数据库服务器询问计数

        4
  •  0
  •   Ross    17 年前

    对每个组织进行查询可能会更容易(但效率较低)(再加上一个查询,以确定大概有多少个组织)。

    一个更好的方法是预先循环数组。例如:

    $sql = $mysqli->query('SELECT * FROM `organisation_members` ORDER BY `organisation` DESC');
    
    if (!$sql || $sql->num_rows) {
        // No data
    } else {
        $data = array();
        while ($row = $sql->fetch_assoc()) {}
            if (!array_key_exists($row['organisation'], $data)) {
                $data[$row['organisation']] = array();
            }
            $data[$row['organisation']][]['name'] = $row['name'];
            // ...
        }
        $sql->close();
        echo '<table>';
        foreach ($data as $org => $people) {
            $people_in_org = count($data[$org]) - 1;
            $counter = 0;
    
            echo '<tr>';
            echo '<td rowspan="' . $people_in_org + 1 . '">' . $org . '</td>';
    
            while ($counter < $people_in_org) {
                if (counter > 0) {
                    echo '<tr>';
                }
                echo '<td>' . $people[$counter]['name'] . '</td>';
                // etc
                echo '</tr>';
            }
        }
        echo '</table>';
    }
    
        5
  •  0
  •   John Nilsson    17 年前

    为了节省内存,您可以在org缓冲行时迭代结果集,当org更改时,打印当前批并开始缓冲下一批。

        6
  •  0
  •   Jrgns    17 年前

    这对你的划船没有帮助,但要仔细观察 WITH ROLLUP

        7
  •  0
  •   boerl boerl    17 年前

        <?php
    
        require_once "HTML/Table.php";
    
    
    
    
        $table = new HTML_Table(array('border'=>'1'));
        $bo=array(
            array('6','a2','a3','a4'),
            array('1','b2','b3','b4'),
            array('1','c2','c3','c4') ,
            array('2','c2','c3','c4') ,
            array('2','c2','c3','c4') ,
            array('4','c2','c3','c4') );
    
        foreach ($bo as $r => $borow)
            $table->addRow($borow);
    
        $rsFirst=0;
        $rsLen=0; 
        foreach ($bo as $r => $borow) {
            if ($r!=0 and $borow[0]!=$prevrow[0] ) {
                //jump in values
                $table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
                $rsFirst=$r;
                $rsLen=0;
            }
            $prevrow=$borow;
            $rsLen++; 
            if ($r==sizeof($bo) - 1) {
                $table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
            }
        }
    
    
        echo $table->toHTML();
    
        ?>