管理员admin表:id 编号(从一开始) 主键,a_id 姓名,a_password 密码,a_tel 联系方式; 宿舍楼dormitory表:C_id 楼栋 主键,s_gender 楼住性别,id 管理员 外键 ;宿舍room表:roomid 宿舍号 ,rfloor 楼层,num 空余床位,price 价格 ;学生信息stu_info表:id 编号 主键,sno 学号,sname 姓名,age 年龄,gender 性别,s_phone电话,dept_id学院 外键,g_id年级 外键,C_id 楼栋 外键,s_roomid 宿舍号 外键; 院系dept表:dept_id 编号 主键,name 院系名称 ;年级grade表:g_id 编号 主键,grade 年级;对这些学生根据院系和年级进行宿舍分配,假设一个宿舍只能住四个人 mysql语句
时间: 2024-02-12 21:05:32 浏览: 103
首先,我们需要创建一个视图,以便方便地获取每个宿舍的空余床位数量:
```
CREATE VIEW room_vacancy AS
SELECT r.roomid, COUNT(*) AS num_vacant
FROM room r
LEFT JOIN stu_info s ON r.roomid = s.s_roomid
WHERE s.s_roomid IS NULL
GROUP BY r.roomid;
```
接下来,我们可以使用以下 SQL 语句来进行宿舍分配:
```
INSERT INTO stu_info (sno, sname, age, gender, s_phone, dept_id, g_id, C_id, s_roomid)
SELECT s.sno, s.sname, s.age, s.gender, s.s_phone, s.dept_id, s.g_id, d.C_id, r.roomid
FROM (
SELECT s.*, ROW_NUMBER() OVER (PARTITION BY s.dept_id, s.g_id ORDER BY s.sno) AS row_num
FROM stu_info s
) AS s
JOIN dept d ON s.dept_id = d.dept_id
JOIN grade g ON s.g_id = g.g_id
JOIN room_vacancy rv ON rv.num_vacant >= 4
JOIN room r ON rv.roomid = r.roomid
WHERE s.s_roomid IS NULL AND s.row_num <= 4;
```
这个 SQL 语句会将每个院系和年级的学生按照学号顺序进行排序,并将他们分配到空余床位数大于等于 4 的宿舍中。每个宿舍最多只会分配 4 个学生。
阅读全文