在fetch中使用fetch和在PHP中选择结果

时间:2013-02-05 14:11:40

标签: php sql

在下面的代码中,我发送一个请求,我把结果放在一个使用PDO fetch的表中。但是当我们有一个带有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>';
}
?>

1 个答案:

答案 0 :(得分: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;
}

第二个选项是一次执行两个查询并同时从两个查询中检索数据。第一个查询按主键分组,没有左连接,第二个是从先前左连接的表中选择。两个查询必须以相同的方式排序。从第一个查询中获取一行,然后从第二个查询中获取具有相同主键的所有查询。与合并排序工作方式相同。当你有很大的成果时它会有所帮助,但通常你可以坚持使用第一个变种。