2017-05-08 12 views
0

次のクエリがあります。私はそれが 'yahrzeit'とtbldecedentテーブルのすべてのレコードを含む必要があり、マッチ(dupes)は1回だけリストされるべきです。MySql内部結合および除外

SELECT *, Count(*) 
FROM yahrzeit 
WHERE confirmed = 1 

INNER 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 

GROUP BY tbldecedent.Name, tbldecedent.EngDate 
+0

あなたの質問は正確ですか?間違いはありますか?正しい結果を得られていませんか? – Seirddriezel

+0

このクエリでは、両方のテーブルで一致するレコードのみを取得していますが、両方のテーブルから一致しないすべてのレコードが結果に含まれ、一度一致するレコードのみがリストされます。意味 - 両方のテーブルからすべてのレコードを取得したいが、二重引用符は使用しない。 – MG1

+0

したがって、mySQLでサポートされていない完全外部結合を使用するには、テーブルに対してLEFT結合を使用し、次に同じテーブル順序で右結合を使用するUNIONを使用します。例:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – xQbert

答えて

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/ダイアグラムのアプローチは良いものです。

最後に、2つのフィールドだけを含むことによってグループにselect *, count()をお勧めしません。 Selectには、グループ内の値をプラスの 集計または定数のみで含める必要があります。現在のバージョンのMySQLでは、グローバル設定を変更することなくこの問題を解決することはできません。他のエンジンは単にこの方法をサポートしていません。 MySQLはそれを許可するためにグループを拡張します。グループに列挙されていない列については、予期しない結果になることがあります。その詳細については、docs:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

これを実行しようとすると内部エラー500が発生します。 tbldecedentテーブルには32667のレコードがあります – MG1

+1

個別に実行するとエラーが発生しますか? (組合なしで)?どのテーブルが確認されていますか? – xQbert

+0

エラー500は、トラブルシューティングには汎用性がありません。私は、エラーが上記にあるか、世代にあるかどうかを確認するためにdbに対して直接実行することをお勧めします(私は非常にそのドライバの問題を疑っています) – xQbert

関連する問題