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

如何按楼栋获取数据库中对应最小房间号的首行数据?

解决按楼栋获取最小房间号数据的问题

看起来你是想根据指定楼栋号,拿到该楼栋下房间号最小的那条数据,但当前的SQL写法出了问题,导致返回了该楼栋的所有房间。我来帮你梳理下问题和解决方案:

问题出在哪?

你当前的WHERE条件逻辑不对:

WHERE (SELECT MIN(room_num) FROM ha_rooms) and bldg_num = '$bldg_num'

这个子查询SELECT MIN(room_num) FROM ha_rooms会返回整个表的最小房间号,而不是当前楼栋的。在SQL里,非零数值会被当作布尔值true,所以这个条件等价于只判断bldg_num = '$bldg_num',自然会返回该楼栋的所有房间,而不是你要的单条最小房间号数据。

正确的写法有两种:

方法1:用排序+取第一条(最直观)

利用CodeIgniter的查询构造器,先筛选楼栋,再按房间号升序排序,最后只取第一条:

// 先检查有没有对应楼栋的房间
$roomExists = $this->db->where("bldg_num", $bldg_num)->count_all_results("rooms");

if ($roomExists == 0) {
    echo "no data match";
} else {
    // 获取该楼栋最小房间号的那条数据
    $minRoom = $this->db->select("*")
        ->from("rooms")
        ->where("bldg_num", $bldg_num)
        ->order_by("room_num", "ASC")
        ->limit(1)
        ->get()
        ->row_array(); // 单条数据用row_array(),不用foreach循环

    $output['room_num'] = $minRoom['room_num'];
    echo json_encode($output);
}

方法2:用子查询匹配当前楼栋的最小房间号

如果想用子查询,记得子查询里也要加上楼栋号的筛选,确保拿到的是当前楼栋的最小房间号:

$minRoom = $this->db->select("*")
    ->from("rooms")
    ->where("bldg_num", $bldg_num)
    ->where("room_num = (SELECT MIN(room_num) FROM rooms WHERE bldg_num = ?)", $bldg_num) // 用参数绑定防SQL注入
    ->get()
    ->row_array();

if ($minRoom) {
    $output['room_num'] = $minRoom['room_num'];
    echo json_encode($output);
} else {
    echo "no data match";
}

额外提醒:

  • 注意SQL注入风险:不要直接把$bldg_num拼进字符串里,用CodeIgniter的查询构造器参数绑定(比如where("bldg_num", $bldg_num)或者where(..., ?, $bldg_num))更安全。
  • 你原来代码里的if ($query->num_rows == 0) { echo "some data match";逻辑反了,应该是没有数据时输出“no data match”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:48