从数据库中获取记录时的动态行数

时间:2011-05-30 07:34:14

标签: php mysql

Ename   Sal      
tom     100
tom     200
bill    100
bill    250
bill    450
bill    400

这是给出上述输出的查询和html结构。

<?php 
$sql = "select * from emp ";
$result= mysql_query($sql);
while($row=mysql_fetch_array($result))
{
  <tr >
    <td rowspan=""  ><?php echo $row['ename']; ?></td>
    <td><?php echo $row['esal']?></td>
  </tr>
  <? }?>

我如何获得以下输出:

Ename   Sal      
tom     100
        200
bill    100
        250
        450
        400

4 个答案:

答案 0 :(得分:7)

抱歉我的英语不好: 我在这里回答了这个问题How to show data from database with dynamic rowspan。让我再次尝试回答这个问题。首先,以免我们处理mysql查询。

MySql工作:

在mysql查询中,您没有查询order by。因为在现实生活中,你不能指望毕竟汤姆的记录,账单记录会在那里。例如,请进行以下插入。

INSERT INTO test_work(ename, sal) 
               VALUES("tom",  100), 
                     ("bill", 450), 
                     ("bill", 100), 
                     ("tom",  200),
                     ("bill", 250),
                     ("bill", 400),
                     ("James", 50);
SELECT * FROM test_work;

<强>结果:

+-------+------+
| ename | sal  |
+-------+------+
| tom   |  100 |
| bill  |  450 |
| bill  |  100 |
| tom   |  200 |
| bill  |  250 |
| bill  |  400 |
| James |   50 |
+-------+------+

所以你的mysql查询应该是ename命令。这里也应该是每个人的 sal 。所以我们的查询:

SELECT * FROM emp ORDER BY ename, sal;

<强> CODING:

  1. 我们可以将整个任务分为3个部分。
    1. Mysql数据获取和存储在数组中。
    2. 计算rowspan
    3. 打印
  2. MySql Datafetching:

    在从mysql服务器获取数据期间,我们总是应该尝试使用mysql_fetch_assoc函数而不是mysql_fetch_array。因为mysql_fetch_assoc只返回ename和sal。但mysql_fetch_array将返回索引为ename,sal,0,1的数组。

        # connect to mysql server
        # and select the database, on which
        # we will work.
        $conn = mysql_connect('', 'root', '');
        $db   = mysql_select_db('test');
    
        # Query the data from database.
        $query  = 'SELECT * FROM test_work ORDER BY ename, sal';
        $result = mysql_query($query);
    
        # Intialize the array, which will 
        # store the fetched data.
        $sal = array();
        $emp = array();
    
        # Loop over all the fetched data, and save the
        # data in array.
        while($row = mysql_fetch_assoc($result)) {
            array_push($emp, $row['ename']);
            array_push($sal, $row['sal']);
        }
    

    计算行间距:

        # Intialize the array, which will store the 
        # rowspan for the user.
        $arr = array();
    
        # loop over all the sal array
        for ($i = 0; $i < sizeof($sal); $i++) {
            $empName = $emp[$i];
    
            # If there is no array for the employee
            # then create a elemnt.
            if (!isset($arr[$empName])) {
                $arr[$empName] = array();
                $arr[$empName]['rowspan'] = 0;
            }
    
            $arr[$empName]['printed'] = "no";
    
            # Increment the row span value.
            $arr[$empName]['rowspan'] += 1;
        }
    

    当你将print_r arr数组时,输出将是:

    Array
    (
        [bill] => Array
            (
                [rowspan] => 4
                [printed] => no
            )
    
        [James] => Array
            (
                [rowspan] => 1
                [printed] => no
            )
    
        [tom] => Array
            (
                [rowspan] => 2
                [printed] => no
            )
    
    )
    

    使用rowspan打印:

        echo "<table cellspacing='0' cellpadding='0'>
                <tr>
                    <th>Ename</th>
                    <th>Sal</th>
                </tr>";
    
    
        for($i=0; $i < sizeof($sal); $i++) {
            $empName = $emp[$i];
            echo "<tr>";
    
            # If this row is not printed then print.
            # and make the printed value to "yes", so that
            # next time it will not printed.
            if ($arr[$empName]['printed'] == 'no') {
                echo "<td rowspan='".$arr[$empName]['rowspan']."'>".$empName."</td>";
                $arr[$empName]['printed'] = 'yes';
            }
            echo "<td>".$sal[$i]."</td>";
            echo "</tr>";
        }
        echo "</table>";
    

    代码优化:

    现在我们可以结合rowspan计算和mysql数据获取。因为在数组中保存获取的数据时,我们可以计算行数。所以我们的最终代码:

    <!DOCTYPE html>
    <html>
        <head>
            <style>
                table tr td, table tr th{
                    border: black 1px solid;
                    padding: 5px;
                }
            </style>
        </head>
        <body>
            <?php
            # connect to mysql server
            # and select the database, on which
            # we will work.
            $conn = mysql_connect('', 'root', '');
            $db   = mysql_select_db('test');
    
            # Query the data from database.
            $query  = 'SELECT * FROM test_work ORDER BY ename, sal';
            $result = mysql_query($query);
    
            # $arr is array which will be help ful during 
            # printing
            $arr = array();
    
            # Intialize the array, which will 
            # store the fetched data.
            $sal = array();
            $emp = array();
    
            #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
            #     data saving and rowspan calculation        #
            #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
    
            # Loop over all the fetched data, and save the
            # data.
            while($row = mysql_fetch_assoc($result)) {
                array_push($emp, $row['ename']);
                array_push($sal, $row['sal']);
    
                if (!isset($arr[$row['ename']])) {
                    $arr[$row['ename']]['rowspan'] = 0;
                }
                $arr[$row['ename']]['printed'] = 'no';
                $arr[$row['ename']]['rowspan'] += 1;
            }
    
    
            #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            #        DATA PRINTING             #
            #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
            echo "<table cellspacing='0' cellpadding='0'>
                    <tr>
                        <th>Ename</th>
                        <th>Sal</th>
                    </tr>";
    
    
            for($i=0; $i < sizeof($sal); $i++) {
                $empName = $emp[$i];
                echo "<tr>";
    
                # If this row is not printed then print.
                # and make the printed value to "yes", so that
                # next time it will not printed.
                if ($arr[$empName]['printed'] == 'no') {
                    echo "<td rowspan='".$arr[$empName]['rowspan']."'>".$empName."</td>";
                    $arr[$empName]['printed'] = 'yes';
                }
                echo "<td>".$sal[$i]."</td>";
                echo "</tr>";
            }
            echo "</table>";
            ?>
        </body>
    </html>
    

    结果:

    a busy cat

答案 1 :(得分:0)

这样的东西?

While data
 echo
   <tr>
        <td rowspan="3"><p>numbers</p></td>
        <td><p>1</p></td>
        <td><p>2</p></td>
 </tr>

请发布您的代码

答案 2 :(得分:0)

您可以使用最后一行和当前行检查此类情况。

$sql = "select * from emp";
$result= mysql_query($sql);
echo "<table>";
while($row=mysql_fetch_array($result))
{ 
  $now=$row[0];
  if($last!=$now) {
  echo "<tr><td>$row['ename']</td><td>$row['esal']</td></tr>";
  }else{
  echo "<tr><td>&nbsp;</td><td>$row['esal']</td></tr>";
  }
  $last = $row[0];
 }
echo "</table>";

我希望这会对你有所帮助。

答案 3 :(得分:0)

应该是这样的

<?php 
    $sql = "SELECT * FROM emp ";
    $result= mysql_query($sql);
    while($row=mysql_fetch_array($result)):
      $ename = $row['ename'];

      // count the esal in each ename
      $sql2 = "SELECT * FROM emp WHERE ename=$ename";
      $result2 = mysql_query($sql2);
      $count_result2 = mysql_num_rows($result2);

    ?>
      <tr >
        <td rowspan="<?php echo $count_result2; ?>"><?php echo $row['ename']; ?></td>
        <?php
          // loop each esal
          while($row2 = mysql_fetch_array($result2)):
          ?>
              <td><?php echo $row['esal']; ?></td>
            </tr>
          <?php
          endwhile; // endwhile for each esal looping
    endwhile; // endwhile for the main looping
    ?>