You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段会是NULL
  • COALESCE:当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
    }
}
?>

简化点说明:

  1. 移除冗余判断:SQL已经处理了患者名称的显示,PHP直接输出即可
  2. 统一逻辑分支:用$isVacant变量一次性判断空床位,避免重复的条件判断
  3. 安全优化:加入htmlspecialchars防止XSS注入风险
  4. 代码可读性提升:结构更清晰,减少重复的HTML输出

内容的提问来源于stack exchange,提问作者Hanna Teobald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:23:14