在PHP中,在一行上显示来自不同表(通过外键关联)的两个字段的数据
我正在开发一个时间“打孔”系统,我正在尝试用PHP构建一个表,以水平显示来自两个表的数据: tb_用户作为u tb_冲压为p 我希望数据如下所示:在PHP中,在一行上显示来自不同表(通过外键关联)的两个字段的数据,php,postgresql,row,Php,Postgresql,Row,我正在开发一个时间“打孔”系统,我正在尝试用PHP构建一个表,以水平显示来自两个表的数据: tb_用户作为u tb_冲压为p 我希望数据如下所示: u.user p.punch p.punch p.punch p.punch +-------+----------+----------+----------+----------+ |User 1 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 | |User 2 | 08:00:0
u.user p.punch p.punch p.punch p.punch
+-------+----------+----------+----------+----------+
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |
|User 2 | 08:00:00 | 12:00:00 | | |
|User 3 | 09:00:00 | | | |
+-------+----------+----------+----------+----------+
u.user p.punch p.punch p.punch p.punch
+-------+----------+----------+----------+----------+
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |
|User 2 | 08:00:00 | 12:00:00 | | |
|User 3 | 09:00:00 | | | |
+-------+----------+----------+----------+----------+
等等
但我得到了以下结果:
u.user p.punch p.punch p.punch p.punch p.punch p.punch p.punch
+-------+----------+----------+----------+----------+---------+----------+---------+
|User 1 | 10:00:00 | | | | | | |
|User 1 | 10:00:00 | 12:00:00 | | | | | |
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 | | | | |
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 | | | |
|User 2 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |08:00:00 | | |
|User 2 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |08:00:00 | 12:00:00 | |
|User 3 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |08:00:00 | 12:00:00 |09:00:00 |
+-------+----------+----------+----------+----------+---------+----------+---------+
我的意思是,它会在每一行重复每一次打孔,而我只想按用户对打孔进行分组
以下是我如何尝试做到这一点:
$query = "SELECT u.user, p.punch FROM users u INNER JOIN punches p ON u.id = p.id_user"
$rt = pg_query($query) or die ("Error: [" . $query . "]");
$punches = array();
echo "<tbody>";
while($nt=pg_fetch_assoc($rt)){
echo "<tr>";
echo "<td>" . $nt[user] . "</td>";
$punches[] = $nt[punch];
foreach ($punches as $punch){
echo "<td>" . date('H:i:s',strtotime($punch)) . "</td>";
}
}
echo "</tr></tbody>";
?>
</table>
$query=“选择u.user,p.punch FROM users u INNER JOIN punchs p ON u.id=p.id\u user”
$rt=pg_query($query)或die(“错误:[“$query.”]”;
$punchs=array();
回声“;
而($nt=pg\U fetch\U assoc($rt)){
回声“;
回显“$nt[用户]”;
$punchs[]=$nt[punch];
foreach($punchs作为$punch){
回显“.date('H:i:s',strottime($punch))”;
}
}
回声“;
?>
有什么线索可能是错的吗?
谢谢大家! 尝试将
按u.id分组
添加到您的查询中。尝试选择u.user,string_agg(p.punch,,')作为用户的穿孔,作为u.id=p.id_用户按u.user分组
然后像
while($nt = pg_fetch_assoc($rt)) {
echo "<tr><td>{$nt['user']}</td>";
echo "<td>",implode('</td><td>',explode(',',$nt['punches'])),"</td>";
echo "</tr>";
}
while($nt=pg\u fetch\u assoc($rt)){
回显“{$nt['user']}”;
回声“,”内爆(“,”爆炸(“,”,$nt['Punchs']),”;
回声“;
}
另外,你的代码似乎产生了不平衡的
/
嗯,在我的一个朋友的帮助下,我找到了答案
我没有更改查询语句,只是标记了一些在特定条件下要显示的TRs和TDs。以下是我所做的:
echo "<tbody>";
$prev_user = "";
$flag = true;
while($nt=pg_fetch_assoc($rt)){
if ($flag) {
echo "<tr>";
echo "<td>" . $nt[user] . "</td>";
$prev_user = $nt[user];
}
if ($prev_user != $nt[user]) {
echo "</tr>";
echo "<tr>";
echo "<td>" . $nt[user] . "</td>";
}
echo "<td>" . date('H:i:s',strtotime($nt[punch])) . "</td>";
$prev_user = $nt[user];
$flag = false;
}
echo "</tbody>";
我不建议您将SQL查询与表示层或工作流层混合使用。使用Pomm可以查询数据库,如下所示:
SELECT
u.user,
... -- other users fields
array_agg(p.punch) AS punch_times
FROM
users u
INNER JOIN punchs p ON u.id = p.id_user
GROUP BY
u.user,
... -- other users fields
并在名为punch\u times
的字段中直接获取一个用户对象集合,其中包含一个额外的DateTime数组。因此,您的模板将成为:
<tbody>
<?php foreach ($users as $user): ?>
<tr>
<td><?php echo $user['user'] ?></td>
<td>
<ul>
<?php foreach ($user['punch-times'] as $punch_time): ?>
<li><?php echo $punch_time->format('H:i:s') ?></li>
<?php endforeach ?>
</td>
</tr>
<?php endforeach ?>
</tbody>
这似乎不可能,除非我遗漏了什么。您的select语句只有两列,但您的两个结果都显示了更多的内容……这很有意义,但还需要user in group by或user的聚合表达式(任何最适合OP的表达式-为了简单起见,我刚刚按他所寻找的字段进行了分组)。