2017-05-08 37 views
0

我有以下查詢。我需要它包含來自'yahrzeit'和tbldecedent表的所有記錄,並且匹配(dupes)的記錄應該只列出一次。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連接,然後在同一個表順序上使用右連接。例如:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – xQbert

回答

1

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

+0

當我嘗試運行此操作時,出現內部錯誤500。 tbldecedent表有32667條記錄 – MG1

+1

當您分別運行每個表時,是否出現錯誤? (沒有工會?)什麼表被證實? – xQbert

+0

錯誤500太一般來排除故障。我建議直接運行這個對數據庫,看看是否在上述錯誤或在一代(我高度懷疑它的驅動程序問題) – xQbert