SQL查询优化:如何获取所有床位记录(含未分配患者的空床位)
解决指定院区床位展示(含空床位)的问题
你的核心问题是原SQL用了内连接(隐式的bed,patient逗号分隔),只会返回同时存在匹配患者的床位记录,空床位因为没有对应患者会被过滤掉。下面是完整的优化方案:
一、优化SQL语句:使用左连接获取全部床位
我们需要用LEFT JOIN以床位表(bed)为主表,关联患者表(patient),这样不管床位有没有分配患者,都会被返回。同时用COALESCE函数直接处理空床位的患者名称,避免PHP里额外判断:
SELECT bed.bed_id, bed.patient_bed_id, bed.station, -- 空床位时返回'-',否则返回患者姓名 COALESCE(patient.patient_name, '-') AS patient_name FROM bed -- 左连接:保留bed表所有符合条件的记录,匹配不到patient时字段为NULL LEFT JOIN patient ON bed.patient_bed_id = patient.patient_id -- 过滤指定院区,注意:根据你的表数据,station是数字1/2,若实际是字符串'Station 1'请修改 WHERE bed.station = '1' -- 按床位编号排序,保证展示顺序一致 ORDER BY bed.bed_id -- 限制最多12个床位 LIMIT 12;
关键说明:
LEFT JOIN:确保所有指定院区的床位都被查询到,空床位对应的patient字段会是NULLCOALESCE:当patient_name为NULL时,自动替换为'-',简化后续PHP逻辑ORDER BY bed.bed_id:保证床位按编号顺序展示,符合业务习惯
二、简化PHP代码逻辑
原PHP代码有大量重复的条件判断和HTML输出,现在基于优化后的SQL,我们可以大幅简化:
<?php // 替换为优化后的SQL语句 $sql = "SELECT bed.bed_id, bed.patient_bed_id, bed.station, COALESCE(patient.patient_name, '-') AS patient_name FROM bed LEFT JOIN patient ON bed.patient_bed_id = patient.patient_id WHERE bed.station = '1' ORDER BY bed.bed_id LIMIT 12"; $query = $pdo->prepare($sql); $query->execute(); $results = $query->fetchAll(PDO::FETCH_OBJ); // 直接遍历结果即可,无需复杂判断 if (!empty($results)) { foreach ($results as $result) { // 统一判断是否为空床位(0表示空) $isVacant = $result->patient_bed_id === 0; // 图标颜色:空床位绿色,已占用红色 $iconColor = $isVacant ? 'text-success' : 'text-danger'; // 空床位的链接ID可以根据业务调整,这里保留原逻辑用patient_bed_id(0) ?> <div class="col-6 col-md-4 col-xl-2"> <a class="block block-rounded text-center" href="bed.php?id=<?= htmlspecialchars($result->patient_bed_id) ?>"> <div class="block-content"> <p class="mt-5 mb-10"> <i class="fa fa-bed <?= $iconColor ?> fa-2x d-xl-none"></i> <i class="fa fa-bed <?= $iconColor ?> fa-3x d-none d-xl-inline-block"></i> </p> <p class="font-w600 font-size-sm text-uppercase"> <?= htmlspecialchars($result->patient_name) ?> </p> </div> </a> </div> <?php } } ?>
简化点说明:
- 移除冗余判断:SQL已经处理了患者名称的显示,PHP直接输出即可
- 统一逻辑分支:用
$isVacant变量一次性判断空床位,避免重复的条件判断 - 安全优化:加入
htmlspecialchars防止XSS注入风险 - 代码可读性提升:结构更清晰,减少重复的HTML输出
内容的提问来源于stack exchange,提问作者Hanna Teobald
相关产品推荐
相关产品推荐

