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 和两个数据表的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中使用多个数据库进行 PDO 连接查询

PDO PDO_MYSQL MYSQLI MYSQL 的区别

将数据库和PDO选项数组传递到我的连接PHP文件中

php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例

PHP PDO-MYSQL:如何跨不同类使用数据库连接

PHP开发-PDO