如何按楼栋获取数据库中对应最小房间号的首行数据?
解决按楼栋获取最小房间号数据的问题
看起来你是想根据指定楼栋号,拿到该楼栋下房间号最小的那条数据,但当前的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
相关产品推荐
相关产品推荐

