0

たとえば、次の MySQL テーブルがあります。

parent_id | child_id
---------------------
       1  |  4
       1  |  3
       1  |  5
       2  |  8
       3  |  7

親とそのすべての子を以下のような形式で出力したい:

parent     |    child
---------------------
           |      4
        1  |      3
           |      5
---------------------
        2  |      8
---------------------
        3  |      7

基本的に、親の ONCE(Distinct) を表示し、そのすべての子を PHP で一覧表示したいだけです。1 つの SQL クエリだけで上記の結果を取得することは可能ですか? 最初に親にクエリを実行し、次に親 ID を使用して再帰的に子にクエリを実行すると、上記の結果を得ることができますが、DB にヒットする SQL クエリがさらに多くなります。

または、すべてのparent_idとchildren_idを含む結果を取得し、配列を使用してPHPで上記の結果を達成しますか? もしそうなら、方法を教えてください。

4

1 に答える 1

2

はい。通常は選択し、親を配列内のキーとして使用します。

//Query normally
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $result[$row["parent_id"]][] = $row["child_id"];
}

または似たようなもの。

編集

表示部分は次のようになります。

<?php

$result = array(
    1 => array(4, 3, 5),
    2 => array(8),
    3 => array(7)
); //Assuming you get a resultset like this.
$rowIsOpened = false; //Indicates whether a row is currently opened.

//I'm using $rowIsOpened because the row immediately after the rowspanned cell shouldn't be closed.

echo <<<HTML
<table>
    <thead>
        <tr>
            <th>Parent</th>
            <th>Children</th>
        </tr>
    </thead>
    <tbody>
HTML;
//Echo a bunch of HTML before actually looping

foreach ($result as $parent => $children) {
    echo "<tr>";
    echo "<td rowspan=";
    echo count($children); //Span over <how many children are> rows
    echo ">$parent</td>";
    $rowIsOpened = true; //Row is opened
    foreach ($children as $child) {
        if (!$rowIsOpened) {
            echo "<tr>";
        } //Only open a row if row is not opened
        echo "<td>$child</td>";
        echo "</tr>";
        $rowIsOpened = false; //Row is now closed. Ready for next iteration.
    }

}
//Close the table tags etc.
echo <<<HTML
    </tbody>
</table>
HTML;
于 2012-05-03T21:02:43.367 に答える