在下面的代码中,我发送一个请求,我把结果放在一个使用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>';
}
?>
答案 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;
}
第二个选项是一次执行两个查询并同时从两个查询中检索数据。第一个查询按主键分组,没有左连接,第二个是从先前左连接的表中选择。两个查询必须以相同的方式排序。从第一个查询中获取一行,然后从第二个查询中获取具有相同主键的所有查询。与合并排序工作方式相同。当你有很大的成果时它会有所帮助,但通常你可以坚持使用第一个变种。