MySQL JOIN带WHERE子句返回过多行问题排查
问题分析与解决
嘿,我来帮你排查这个SQL查询的问题!你遇到的核心问题是:查询返回了该司机的所有广告,而非乘客实际预订的那一条,根源出在reserved_rides和advertisement表的关联条件上。
问题具体原因
你当前用reserved_rides.driver_id = advertisement.user_id来关联两张表——这个条件只会把乘客预订的司机名下的所有广告都关联出来,完全没有限定到乘客实际预订的那条特定广告。正常来说,reserved_rides(预订行程表)应该有一个字段(比如advertisement_id)用来记录乘客具体预订的广告ID,你需要用这个字段来关联advertisement.id,才能精准拿到乘客预订的那条行程信息。
修正后的查询语句
假设你的reserved_rides表确实存在advertisement_id字段(如果字段名不同,替换成你实际的字段名即可),修正后的查询如下:
SELECT advertisement.id, COUNT(review.driver_id) AS 'review_count', ROUND(AVG(review.mark), 1) AS 'rating', users.unique_id, users.name, users.surname, users.phone, YEAR(CURDATE()) - YEAR(users.birthdate) AS age, users.image, advertisement.from_city, advertisement.to_city, users.car_name, users.car_model, users.car_make_year, advertisement.number_of_places, advertisement.price, advertisement.datetime, advertisement.info FROM reserved_rides -- 关键修正:用预订的广告ID关联,而非仅司机ID JOIN advertisement ON reserved_rides.advertisement_id = advertisement.id LEFT JOIN review ON reserved_rides.driver_id = review.driver_id JOIN users ON reserved_rides.driver_id = users.unique_id WHERE reserved_rides.passenger_id = ? -- 严格模式下需包含所有非聚合列(MySQL 5.7+ 默认开启ONLY_FULL_GROUP_BY) GROUP BY advertisement.id, users.unique_id, users.name, users.surname, users.phone, users.birthdate, users.image, users.car_name, users.car_model, users.car_make_year, advertisement.from_city, advertisement.to_city, advertisement.number_of_places, advertisement.price, advertisement.datetime, advertisement.info ORDER BY advertisement.datetime ASC;
额外说明
如果你使用的是MySQL 5.7及以上版本,默认开启了ONLY_FULL_GROUP_BY严格模式,原查询的GROUP BY advertisement.id会触发语法错误——因为SELECT语句中所有非聚合字段都必须出现在GROUP BY子句里。修正后的查询已经补充了这些字段,确保符合语法规范。
内容的提问来源于stack exchange,提问作者kewin432
相关产品推荐
相关产品推荐

