MySql内部加入和排除

时间:2017-05-08 16:02:59

标签: mysql

我有以下查询。我需要它包含来自'yahrzeit'和tbldecedent表的所有记录,而匹配的那些(dupes)应该只列出一次。

"All versions "

1 个答案:

答案 0 :(得分:1)

连接后的子句属于何处。 由于我们使用外连接,我们必须确保匹配记录的where子句标准被移动到连接或外连接被否定。

在mySQL中模拟一个完整的外连接我们简单地做一个左右连接与一个联合ALL(联合做一个独特的删除重复)

SELECT tbldecedent.Name, tbldecedent.EngDate, Count(*) as Cnt
FROM yahrzeit
LEFT JOIN tbldecedent 
  ON CONCAT( yahrzeit.firstName,  ' ', yahrzeit.middleName,  ' ', yahrzeit.lastName ) = tbldecedent.Name
 AND DATE_FORMAT( CONCAT( yahrzeit.gregorianYear,  '-', yahrzeit.gregorianMonthNum,  '-', yahrzeit.gregorianDay ) ,  '%Y-%m-%d' ) = tbldecedent.EngDate
WHERE yahrzeit.confirmed = 1
  AND tblDecedent.name is null -- add this to only show no matches.
GROUP BY tbldecedent.Name, tbldecedent.EngDate

UNION ALL

SELECT tbldecedent.Name, tbldecedent.EngDate, Count(*) as cnt
FROM yahrzeit
RIGHT JOIN tbldecedent 
   ON CONCAT( yahrzeit.firstName,  ' ', yahrzeit.middleName,  ' ', yahrzeit.lastName ) = tbldecedent.Name
  AND DATE_FORMAT( CONCAT( yahrzeit.gregorianYear,  '-', yahrzeit.gregorianMonthNum,  '-', yahrzeit.gregorianDay ) ,  '%Y-%m-%d' ) = tbldecedent.EngDate
  AND yhrzeit.confirmed = 1    
WHERE CONCAT( yahrzeit.firstName,  ' ', yahrzeit.middleName,  ' ', yahrzeit.lastName ) is null -- add this to only show no matches.
GROUP BY tbldecedent.Name, tbldecedent.EngDate

为了更好地理解联接,我建议:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/维恩图方法是一个很好的方法。

最后,我不推荐只包含两个字段的select *, count()组。选择应仅包括加上组中的值 聚合或常数。当前版本的MySQL不会让你在不改变全局设置的情况下逃脱这一点,而其他引擎根本不支持这种方法。 MySQL扩展了组以允许它;但是对于未在组中列出的列,结果可能是意外的。有关详情,请参阅文档:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html