ここで、句は結合後に属します。 外部結合を使用しているので、一致するレコードの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/ダイアグラムのアプローチは良いものです。
最後に、2つのフィールドだけを含むことによってグループにselect *, count()
をお勧めしません。 Selectには、グループ内の値をプラスの 集計または定数のみで含める必要があります。現在のバージョンのMySQLでは、グローバル設定を変更することなくこの問題を解決することはできません。他のエンジンは単にこの方法をサポートしていません。 MySQLはそれを許可するためにグループを拡張します。グループに列挙されていない列については、予期しない結果になることがあります。その詳細については、docs:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
あなたの質問は正確ですか?間違いはありますか?正しい結果を得られていませんか? – Seirddriezel
このクエリでは、両方のテーブルで一致するレコードのみを取得していますが、両方のテーブルから一致しないすべてのレコードが結果に含まれ、一度一致するレコードのみがリストされます。意味 - 両方のテーブルからすべてのレコードを取得したいが、二重引用符は使用しない。 – MG1
したがって、mySQLでサポートされていない完全外部結合を使用するには、テーブルに対してLEFT結合を使用し、次に同じテーブル順序で右結合を使用するUNIONを使用します。例:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – xQbert