where子句屬於連接。 由於我們使用外連接,所以我們必須確保匹配記錄的where子句條件移動到連接或外連接被取消。
在MySQL的
來模擬一個完整的外部聯接,我們簡單的做一個左側,並與工會的權利全部加入(工會做了不同的用於刪除重複項)
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
你的問題到底是什麼?你有錯誤嗎?你沒有得到正確的結果嗎? – Seirddriezel
使用此查詢,我只獲取兩個表中匹配的記錄,但我希望結果具有所有不匹配的記錄,並且只列出一次匹配的記錄。含義 - 我想從兩張表中獲得所有記錄,但沒有任何笨蛋。 – MG1
所以你想要一個在MySQL中不支持的完整外連接,在你的表上使用LEFT連接,然後在同一個表順序上使用右連接。例如:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – xQbert