You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:13:48