MySQL关联booking与student表查询返回重复记录如何修正
问题原因
- 当前语句使用逗号分隔两张表但未添加关联条件,实际执行的是交叉连接,会生成笛卡尔积:每条预约记录会和所有学生记录拼接,直接导致出现大量重复记录,以及学生姓名匹配错误的问题。
- 需求需要保留studentid为NULL的预约记录,所以不能用INNER JOIN,要使用LEFT JOIN关联学生表。
- 原语句字段名和表结构不匹配:Student表字段为
firstname、lastname,不带下划线,原语句写的First_name、Last_name会在大小写敏感的数据库环境下触发字段不存在报错。
修正后的查询语句
SELECT b.booking_date, b.booking_start, CONCAT_WS(' ', s.firstname, s.lastname) AS studentname FROM booking b LEFT JOIN student s ON b.studentid = s.studentid WHERE b.staffid = '$userid' ORDER BY b.booking_start ASC
修改点说明
- 替换原隐式交叉连接为
LEFT JOIN,添加关联条件b.studentid = s.studentid,彻底解决笛卡尔积导致的重复和匹配错误问题 - 使用
CONCAT_WS函数直接拼接学生的姓和名,得到统一的studentname字段,当预约记录没有关联学生时,拼接结果自动为NULL,不需要额外写CASE判断 - 给表添加别名简化语句,避免字段名冲突
- 只保留需求要求返回的三个字段,去掉冗余的返回内容
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

