MySQL DISTINCT返回非唯一结果问题求助
解决MySQL DISTINCT结合LEFT JOIN返回多条结果的问题
嘿,我来帮你搞定这个问题!首先得理清为什么你的DISTINCT没达到预期效果:
你用LEFT JOIN关联订单表和评论表后,每一条评论都会和订单记录生成一条独立的结果行。而DISTINCT是对选中的所有字段组合做去重——因为每条评论的bookingcomment_id和bookingcomment_message都是唯一的,这些字段组合起来自然都是不同的,所以会返回10条结果,这其实是DISTINCT的正常工作逻辑,只是和你的需求不匹配而已。
根据你“仅需判断订单是否存在评论(comment ID不为0时即存在)”的需求,这里给你两个精准的解决方案:
方案一:GROUP BY + 聚合函数获取订单信息及评论状态
通过分组订单ID,配合聚合函数提取评论状态,同时保留订单的唯一记录:
SELECT `booking_id`, `booking_ticket`, `booking_price`, -- 有评论则返回最大的评论ID,无评论则返回0/NULL MAX(`bookingcomment_id`) AS `latest_comment_id`, -- 直接生成是否有评论的标记(1=有,0=无) CASE WHEN MAX(`bookingcomment_id`) != 0 THEN 1 ELSE 0 END AS `has_comment` FROM `mysystem_booking` LEFT JOIN `mysystem_bookingcomment` ON `mysystem_booking`.`booking_id` = `mysystem_bookingcomment`.`bookingcomment_link` WHERE `booking_id` = 29791 GROUP BY `booking_id`, `booking_ticket`, `booking_price`;
方案二:EXISTS子查询高效判断评论存在性
这个方案性能更优,因为它不需要关联整个评论表,只需要判断是否存在符合条件的评论记录,完美贴合你的核心需求:
SELECT `booking_id`, `booking_ticket`, `booking_price`, CASE WHEN EXISTS ( SELECT 1 FROM `mysystem_bookingcomment` WHERE `bookingcomment_link` = `mysystem_booking`.`booking_id` AND `bookingcomment_id` != 0 ) THEN 1 ELSE 0 END AS `has_comment` FROM `mysystem_booking` WHERE `booking_id` = 29791;
如果你的需求只是判断是否有评论,不需要返回具体的评论内容或ID,方案二是最佳选择——它逻辑清晰,执行效率更高,不会因为评论数量多而影响结果行数。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

