MySQL左连接查询用DISTINCT仍出重复结果问题求助
咱们直接戳核心:你查询OrderID=86时出现重复,根源是关联条件不够精准,再结合可能存在的订单表重复记录,才导致了这个问题。
原因分析
你当前的LEFT JOIN sparepartfeedback fb ON fb.OrderID = d.OrderID只匹配了订单ID,但sparepartfeedback里的每条反馈其实是绑定到「某个订单下的特定备件」的(看你的fb表数据:PFID1对应SparePartID49+OrderID86,PFID2对应SparePartID52+OrderID86)。如果只按OrderID关联,每个订单详情行(d)都会和所有同OrderID的fb行关联——比如d表中OrderID86的两条记录,会分别关联fb表的两条记录,直接就产生2*2=4条记录。
而你用DISTINCT无效,是因为这些行在数据库层面其实是「不同」的(比如orders表的其他字段有差异,但你没SELECT出来),所以DISTINCT识别不到是重复。
解决方案
方案1:精准关联备件反馈(最优先)
修改LEFT JOIN的条件,同时匹配OrderID和SparePartID,让每个订单详情只关联到对应的备件反馈:
SELECT d.SparePartID, s.Name, d.Qty, d.Price, d.OrderID , fb.PFID, fb.Review, fb.Rating FROM sparepartorderdetails d LEFT JOIN sparepartfeedback fb ON fb.OrderID = d.OrderID AND fb.SparePartID = d.SparePartID INNER JOIN sparepart s ON d.SparePartID= s.SparePartID INNER JOIN orders o ON o.OrderID = d.OrderID WHERE d.OrderID = "86"
这样直接就能得到你想要的两条结果,完全不需要用DISTINCT。而且对于OrderID=87这种无反馈的订单,这个关联条件依然有效,会正常显示NULL值,不会出现重复。
方案2:清理订单表重复数据
如果方案1执行后还是有重复,那大概率是orders表中存在多条OrderID=86的记录。你可以先验证:
SELECT * FROM orders WHERE OrderID = "86";
如果确实有重复,要么直接清理重复数据(确保订单ID唯一是合理设计),要么在关联orders表时只取唯一记录:
SELECT d.SparePartID, s.Name, d.Qty, d.Price, d.OrderID , fb.PFID, fb.Review, fb.Rating FROM sparepartorderdetails d LEFT JOIN sparepartfeedback fb ON fb.OrderID = d.OrderID AND fb.SparePartID = d.SparePartID INNER JOIN sparepart s ON d.SparePartID= s.SparePartID INNER JOIN (SELECT DISTINCT OrderID FROM orders) o ON o.OrderID = d.OrderID WHERE d.OrderID = "86"
内容的提问来源于stack exchange,提问作者YellowMinion

