希望有人能解决这个问题。
我有以下MySQL查询:
$sql = $db->prepare("SELECT
dienaren.id,
dienaren.achternaam_minister,
dienaren.email_minister,
dienaren.gemeente,
users.achternaam,
users.email,
users.periode_van,
users.periode_tot
FROM dienaren
LEFT JOIN users
ON dienaren.id = users.minister_id
WHERE users.periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY)
ORDER BY dienaren.id,users.periode_tot ASC");
$sql->execute();
这给了我29行的结果(这在我检查时是正确的)
现在我想使用一种循环来显示一个表,其中人A有x行与查询对应。对于人B,人C等同样重要。
以下是当前输出的截图:
正如您所看到的,有2条记录适用于此人。但它显示了两个列表而不是一个总列表。
这是我生成此表的代码:
<?php
$count = $sql->rowCount();
echo '<p>Total result SQL query: '.$count.'</p>';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php foreach($sql->fetchAll(PDO::FETCH_OBJ) as $voorganger): ?>
<div><strong>Person ID: <?= $voorganger->id;?></strong></div>
<div>Is in control of the following users:</div>
<table>
<tr>
<th>Voorletter(s)</th>
<th>Periode Tot</th>
<th>Status</th>
</tr>
<?php
$query = $db->prepare("SELECT * FROM users WHERE minister_id = '{$voorganger->id}' AND periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY) ORDER BY minister_id ASC");
$query->execute();
foreach($query->fetchAll(PDO::FETCH_OBJ) as $user) : ?>
<?php $date = new DateTime($user->periode_tot); ?>
<tr style="background:rgba(244, 65, 55, 0.35);">
<td><?= $user->voorletters; ?></td>
<td><?= $date->format('d-m-Y'); ?></td>
<?php if (dateDifference($user->periode_tot,$currentdate) > 0 && dateDifference($user->periode_tot,$currentdate) <= 30) { ?>
<td>Verloopt over <?= dateDifference($user->periode_tot,$currentdate); ?> dagen</td>
<?php } else { ?>
<td>Verlopen</td>
<?php } ?>
</tr>
<?php endforeach; ?>
</table>
<hr>
<?php endforeach; ?>
</body>
</html>
希望能够帮助我的人明白这一点。如果不是让我知道解释更多。 (顺便说一句:我在表格中改变了一些结果,因为它保存了私人的实际数据)
提前致谢。
编辑:
只是指出在数据库中我有一个dienaren表,在T2上有许多关系(用户名为minister_id持有用户)
循环访问具有例如的用户表。 5结果有一个表创建5次,所有5个结果(zie screenshot 2)。我想要的只是一个表,其中包含这5个结果。我想我没有使用正确的循环功能,或者我还没有正确使用它。
第二次编辑:
我采取了一种不同的方法让我接近我的解决方案。我从JOIN查询更改为SELECT * FROM T1。唯一的缺点是它还显示了所有具有0结果的记录。那么我怎样才能从T1中没有查询T2结果的人那里创建一个表?
(在这种情况下ID:861保存5条记录,但ID:862没有记录,但也有一个空的表。我想摆脱空的表)
答案 0 :(得分:1)
搞定了:
foreach($sql->fetchAll(PDO::FETCH_OBJ) as $person):
$person_id = $person->id;
$query = $db->prepare("SELECT * FROM users WHERE person_id = '{$person_id}' AND periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY)");
$query->execute();
$total = $query->rowCount();
if ($total > 0) {
?>
<div><?= $person_id; ?></div>
<div><?= $person->achternaam_person; ?></div>
<div><?= $person->gemeente; ?></div>
<table>
<tr>
<th>Gemeente</th>
<th>Achternaam(s)</th>
<th>Voorletter(s)</th>
<th>Periode Tot</th>
<th>Status</th>
<th>Email</th>
</tr>
<?php
while ($user = $query->fetch(PDO::FETCH_OBJ)) {
$date = new DateTime($user->periode_tot);
?>
<tr style="background:rgba(244, 65, 55, 0.35);">
<td><?= $user->gemeente; ?></td>
<td><?= $user->achternaam; ?></td>
<td><?= $user->voorletters; ?></td>
<td><?= $date->format('d-m-Y'); ?></td>
<td>Verloopt over <?= dateDifference($user->periode_tot,$currentdate); ?> dagen</td>
<td><?= $user->email; ?></td>
</tr>
<?php } } ?>
</table>
<?php endforeach; ?>
答案 1 :(得分:0)
您可以使用GROUP BY dienaren.id
,因为您似乎不希望在第一次查询中重复该ID。
$sql = $db->prepare("SELECT
dienaren.id,
dienaren.achternaam_minister,
dienaren.email_minister,
dienaren.gemeente,
users.achternaam,
users.email,
users.periode_van,
users.periode_tot
FROM dienaren
LEFT JOIN users
ON dienaren.id = users.minister_id
WHERE users.periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY)
GROUP BY dienaren.id
ORDER BY dienaren.id,users.periode_tot ASC");
$sql->execute();
好像你在第一个查询中选择了很多未使用的东西,你可以删除一些东西或者编辑你的php代码只使用左连接的第一个查询,因为它可以给你所有的信息你需要我相信。