>

Orders 라는 테이블이 있습니다  속성 2 개 : id_order  그리고 id_product .

이 표에서 구매 한 제품 목록을 단일 주문 ID에 추가합니다.

id_order - id_product
1        - 1
1        - 2
1        - 5
1        - 6
2        - 4
2        - 8
2        - 14
3        - 1

이 레코드를 표에 표시하고 싶지만 주문 ID의 1 배만 표시합니다.

<?php
include "con.php";
$sql       = "SELECT DISTINCT a.id_order , b.id_product FROM orders a JOIN orders b ON a.id_order=b.id_order";
$sentence1 = $con->prepare($sql);
$sentence1->execute();
$sentence1->bind_result($id, $product);
?>

    <html>
    <body>
    <table border="3">
    <tr>
    <td>ID of order</td>
    <td>ID of products from this order</td>
    </tr>

    <?php

while ($sentence1->fetch()) {
    echo "<tr>";
    echo "<td>" . $id . "</td>";
    echo "<td>" . $product . "</td>";
    echo "</tr>";
}
$sentence1->close();
?>

문제는이 SQL 쇼가 반복 가능한 횟수에 id_order의 수를 곱한 것입니다.

id_order - id_product
    1        - 1
             - 2
             - 5
             - 6
    ____________
    2        - 4
             - 8
             - 14
    ____________
    3        - 1

내가 원하는 결과는 :

<시간>

다른 디자인 :

  • 답변 # 1

    PHP에서 결과 세트를 반복하는 동안 새로운 id 발생 여부를 추적 할 수 있습니다  값. 그렇다면 표 셀에 표시하고 그렇지 않으면 표시하지 마십시오.

    $id_prev = NULL;
    while ($sentencie->fetch()) {
        echo "<tr>";
        if ($id != $id_prev) {
            echo "<td>" . $id . "</td>";
            $id_prev = $id;
        }
        else {
            echo "<td></td>";    // you could try adding spaces here for padding
        }
        echo "<td>" . $product . "</td>";
        echo "</tr>";
    }
    
    

    구분자 줄에 대해서는 아마도 CSS/HTML 레이어에서 처리해야 할 것입니다.

    업데이트 :

    새로운 요구 사항이 id 를 갖는 것 같습니다.  테이블 셀은 여러 제품 행에 걸쳐 있습니다. 하나의 옵션은 rowspan 를 사용하는 것입니다  테이블 셀의 속성. 여기서 트릭은 전체 id 를 반복해야한다는 것입니다.  제품이 몇 개나 있는지 알기 전에

    $id_prev = NULL;
    $products = array();
    function displayRow($id, $products) {
        for ($x = 0; $x < count($products); $x++) {
            echo "<tr>";        
            if ($x == 0) {
                echo "<td rowspan=\"" . count($products) . "\">" . $id . "</td>";
            }
            echo "<td>" . $products[$x] . "</td>";
            echo "</tr>";
        }
    }
    while ($sentencie->fetch()) {
        if ($id != $id_prev) {
            displayRow($id, $products);
            $products = array();
            $id_prev = $id;
        }
        array_push($products, $product);
    }
    // DON'T forget to call displayRow() one last time, to cover the final id
    // appearing in your result set
    displayRow($id_prev, $products);
    
    

  • 답변 # 2

    여기 sql 명령.

    $sql = "SELECT DISTINCT id_order, GROUP_CONCAT(DISTINCT id_product ORDER BY id_product) AS child_id_list FROM orders group by id_order  ORDER BY id_order";
    $sentence1 = $con->prepare($sql);
    $sentence1->execute();
    $sentence1->bind_result($id, $product);
    
    

관련 자료

  • 이전 컨트롤러와 일치하는 경로가없는 레일
  • 다음 linux - 매개 변수를 사용한 BASH 쉘 스크립팅