尝试实现含OR条件的两次左外连接,MySQL语法报错求助
修正带有OR条件的左外连接SQL语法错误
嘿,我帮你定位到了SQL语句里的几个语法问题,还有一个逻辑上的小坑,咱们一步步来修正:
原语句的主要问题
- SELECT子句里的
(TblA)、(TblB)、(TblC)是无效的语法标记,完全多余,直接去掉即可 - LEFT OUTER JOIN的语法错误:你在表名和ON子句之间加了多余的括号,正确的写法是
LEFT OUTER JOIN 表名 ON (连接条件),不需要在ON前额外加括号 - 逻辑隐患:因为用了OR的连接条件,左连接后会产生重复行,直接用
count()会导致统计结果偏大,建议用count(DISTINCT 字段)来统计唯一记录
修正后的SQL语句
SELECT TblA.user_id, TblA.username, COUNT(DISTINCT TblB.id) AS friend1total, -- 假设TblB有唯一主键id,用来避免重复计数 COUNT(DISTINCT TblC.id) AS messageTotal -- 同理TblC用唯一主键 FROM TblA LEFT OUTER JOIN TblB ON ( TblB.friend1 = TblA.user_id AND requeststatus = 0 OR TblB.friend2 = TblA.user_id AND requeststatus = 0 ) LEFT OUTER JOIN TblC ON ( TblC.friend1 = TblA.user_id OR TblC.friend2 = TblA.user_id ) GROUP BY TblA.user_id, TblA.username;
补充说明
如果TblB和TblC没有单独的主键字段,也可以用组合字段来做DISTINCT,比如COUNT(DISTINCT TblB.friend1, TblB.friend2),这样也能避免重复统计的问题。另外,GROUP BY子句里最好明确指定表名,避免多表字段重名导致的歧义。
内容的提问来源于stack exchange,提问作者Sam Hall
相关产品推荐
相关产品推荐

