0

以下のコードでは、リクエストを送信し、PDOフェッチを使用して結果をテーブルに配置します。ただし、2つの要素を持つ「データ要素」がある場合、テーブルに2つの行が作成され、「要素」ごとに1つ作成されます。例:

****************************************
**Data Element Name** | data 1
****************************************
**Elements**          | element 1
****************************************

****************************************
**Data Element Name** | data 1
****************************************
**Elements**          | element 2
****************************************
and what I want is:
****************************************
**Data Element Name** | data 1
****************************************
**Elements**          |element 1
                      |element 2
****************************************

ありがとうございました!

<?php
if ($select=="Data Element Name"){
 $result="SELECT    
      D1.Data_Element_Name dataElementName,
      D2.Data_Element_Name element
     FROM 
      data_element_name D1
      LEFT JOIN packagedelement ON packagedelement.id=COALESCE(D1.base_Attribute, D1.base_Class)
      LEFT JOIN ownedattribute ON ownedattribute.FK_packagedElement=packagedelement.PrimaryKey
      LEFT JOIN data_element_name D2 ON D2.base_Attribute=ownedattribute.id
          WHERE 
      D1.Data_Element_Name LIKE '%$search%' ";

     try {
    $req =$pdo->query($result);
} catch(PDOException $ex) {
    echo "An Error occured!"; //user friendly message
    some_logging_function($ex->getMessage());
}
    echo 'Data Elements including the keyword: " '.$search.' " ';
    echo '<table id="table1" style="margin-left:10px; width:700px;">';
    //Loop to stock results on an array
    $i=0;
    while($data = $req->fetch())
    { 
    $array[$i]=$data['dataElementName'];
    $element[$i]=$data['element'];
    echo '<tr>
        <td>
                <a href="" onclick="var source = ($(\'#arrow'.$i.'\').attr(\'src\') === \'img/arrowInactive.jpg\') ? \'img/arrowActive.jpg\' : \'img/arrowInactive.jpg\'; $(\'#arrow'.$i.'\').attr(\'src\', source); $(\'#hiddenDiv'.$i.'\').toggle(); return false;">
          <img id="arrow'.$i.'" src="img/arrowInactive.jpg" alt="arrowInactive" />' .json_encode($array[$i]). 
        '</a>
        </td>
               </tr>
          <tr id="hiddenDiv'.$i.'" style="padding-left:20px;display:none">
        <td>
          <table>    
            <tbody>
              <tr>
                <td class="LeftCell">Elements</td>
                <td id="elements">'.json_encode($element[$i]).'</td>
              </tr>
            </tbody>
          </table>
        </td>
          </tr>';
    $i=$i+1;
}
echo '</table>';
}
?>
4

1 に答える 1

1

2つのオプションがあります。

まず、結果を確認しながら、主キーを監視し、キーが変更されるまで2番目の次元を作成します(行を一時配列に格納します)。その場合、1つの論理行が処理され、その一時配列に格納されます。このようなもの:

$last_id = null;
$result = array();
while (($row = fetch())) {
   if ($row['id'] != $last_id) {
       // do something with $result
       $result = array();
       $last_id = $row['id'];
   }
   $result[] = $row;
}

2番目のオプションは、2つのクエリを同時に実行し、両方から同時にデータを取得することです。最初のクエリは左結合なしで主キーによってグループ化され、2番目は以前に左結合されたテーブルから選択されます。両方のクエリを同じ方法で並べ替える必要があります。最初のクエリから1つの行をフェッチしてから、2番目のクエリから同じ主キーを持つすべてのクエリをフェッチします。マージソートが機能するのとまったく同じ方法です。大きな結果が得られた場合に役立ちますが、通常は最初のバリアントを使用できます。

于 2013-02-05T14:27:43.617 に答える