sql >> データベース >  >> RDS >> Mysql

データベースからレコードをフェッチする際の動的行スパン

    英語が下手でごめんなさい:ここで私はこの質問に答えました動的rowspanを使用してデータベースのデータを表示する方法 。もう一度、この質問に答えてみましょう。まず、mysqlクエリに取り組まないようにします。

    MySQLの作業:

    mysqlクエリでは、順序を照会していません。実生活では、トムのすべての記録の後に、請求書の記録がそこにあるとは期待できないからです。たとえば、次の挿入を取ります。

    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で並べ替える必要があります。ここでも各人の販売 注文する必要があります。だから私たちのクエリ:

    SELECT * FROM emp ORDER BY ename, sal;
    

    コーディング:

    1. タスク全体を3つの部分に分けることができます。
      1. Mysqlデータのフェッチと配列への保存。
      2. 行スパンの計算
      3. 印刷

    MySQLデータフェッチ:

    mysqlサーバーからのデータフェッチ中は、常にmysql_fetch_arrayの代わりにmysql_fetch_assoc関数を使用するようにしてください。 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;
        }
    

    arr配列をprint_rすると、出力は次のようになります。

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

    行スパンを使用した印刷:

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

    コードの最適化:

    これで、行スパンの計算と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>
    

    結果:



    1. オンプレミスのセキュリティ制御と主要なクラウドプロバイダーのマッピング–バージョン4.0

    2. MySQLのcsvテーブルをインポートするときにUTF8文字列が無効です

    3. MySQLストレージエンジンの最適化:高性能のためのInnoDB最適化の構成

    4. 画像とjQueryオートコンプリートの統合