PHP 使用 PDO 和两个数据表
Posted
技术标签:
【中文标题】PHP 使用 PDO 和两个数据表【英文标题】:PHP using PDO with two data tables 【发布时间】:2022-01-22 23:06:21 【问题描述】:当device_transactions
表中没有对应的记录,或者device_transactions
表中有对应的记录有returned_date
空白字段时,我希望status列显示值“free”
我想要的返回结果是这样的
这就是我现在能做的一切
当device_transactions
表在设备表中没有对应记录时,如何打印第 4 行?
2个数据表
桌面设备:
id | name |
---|---|
1 | Laptop01 |
2 | Laptop02 |
3 | Laptop03 |
4 | Laptop04 |
表 device_transactions:
id | device_id | start_transaction_plan | end_transaction_plan | returned_date |
---|---|---|---|---|
1 | 1 | 2021-12-10 14:20:43 | 2021-12-12 07:00:00 | 2021-12-12 9:30:23 |
2 | 2 | 2021-12-11 10:10:20 | 2021-12-15 15:30:00 | 2021-12-16 7:30:45 |
3 | 3 | 2021-12-12 19:03:00 | 2021-12-21 08:00:00 | NULL |
<table id="myTable">
<thead>
<tr>
<th>No</th>
<th>Name</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?php
$sql = $conn->prepare("SELECT devices.id, devices.name, device_transactions.returned_date
FROM devices, device_transactions WHERE devices.id = device_transactions.device_id ");
$sql->execute();
$result = $sql->setFetchMode(PDO::FETCH_ASSOC);
foreach ($sql->fetchAll() as $row) ?>
<tr>
<td><?php echo $row['id']; ?></td>
<td><?php echo $row['name']; ?></td>
<td><?php
if($row['returned_date'] !== null )
echo "free";
else
echo "borrowed";
?></td>
</tr>
<?php
?>
</tbody>
</table>
【问题讨论】:
您尝试过什么来解决问题?$row['returned_date']
包含哪些出乎你意料的内容?
我希望结果返回#row4 laptop04 |免费,但由于它在 device_transactions 表中没有记录,我不知道该怎么做。
使用LEFT JOIN
连接设备和设备事务表以从设备表中获取所有结果。如果 device_transactions 表中没有记录,则其余值为 NULL
。
【参考方案1】:
只需使用简单的 LEFT JOIN 即可获得所有记录:
好的,我已经做了一些修改,所以我的答案与已经给出的答案不同,这将帮助您避免在返回日期为空或不为空的情况下进行检查
SELECT d.id as deviceid, d.name as devicename, c.returned_date as returndate
FROM device d
LEFT JOIN device_transactions c ON c.device_id = d.id;
编辑查询 - 所以现在如果没有记录或返回日期为空,您将获得“免费”作为返回类型,否则您将获得“借用”(当然,您可以放任何您想要的...)所以现在无需在 php 中检查 $row['return_date'] == null 是否只输出查询的结果:
SELECT d.id as deviceid, d.name as devicename,
CASE WHEN c.returned_date IS NULL THEN 'free' ELSE 'borrowed' END as returntype
FROM device d
LEFT JOIN device_transactions c ON c.device_id = d.id;
在这里查看它的工作原理
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=32db15fbb2b00d780196ea879e6f7d20
编辑结果:
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=4edc860aa39461f2c5e6655bbca77d66
【讨论】:
【参考方案2】:您想使用LEFT JOIN
,而不是FROM devices, device_transactions
(这是一个INNER JOIN
)。
SELECT devices.id, devices.name, device_transactions.returned_date
FROM devices
LEFT JOIN device_transactions ON devices.id = device_transactions.device_id
【讨论】:
以上是关于PHP 使用 PDO 和两个数据表的主要内容,如果未能解决你的问题,请参考以下文章
PDO PDO_MYSQL MYSQLI MYSQL 的区别