在PHP中,在一行上显示来自不同表(通过外键关联)的两个字段的数据

在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

我正在开发一个时间“打孔”系统,我正在尝试用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: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的表达式-为了简单起见,我刚刚按他所寻找的字段进行了分组)。