2013-12-17 20 views
0

如果主題標題不清楚,則很抱歉。這是我的情況:將2個MySQL表與公共字段進行比較,確定僅在表中的1箇中的數據

客戶端有一個照片圖書館網站與135,000 JPG文件。每個文件在一個名爲「照片」的MySQL表中有一行,其中包含「標題」,「描述」,「關鍵字」,「文件名」等字段...

作爲看家練習,存儲文件的服務器,這會帶來135,010個文件(比我們知道的要多10個)。我將這些文件的文件名存儲在一個名爲「家務」的新表中,還有一個名爲「filename_housekeeping」的字段。

所以我現在擁有的是2張桌子。一行有135,000行,幷包含有關我們知道存在的文件的信息。但是,對服務器的分析顯示有135,010個文件。所以有10個文件是「孤兒」,可能是過去刪除失敗的結果。

我想識別這10個文件,所以我需要比較兩個表/字段「photos.filename」v「housekeeping.filename_housekeeping」,並且只顯示「家務」中不存在的10行,相片」。即我試圖識別服務器上我們不知道的10個文件的文件名。

希望這是顯而易見的。我已經嘗試了一些類似的問題在stackoverflow的解決方案,但他們並不完全正確。

非常感謝。

James。

回答

0

這應該讓你,只有在表中的一個,但不是在其他存在的行,避免代價高昂的加入或復發的子查詢:

SELECT sq.filename 
FROM (SELECT filename 
     FROM photos 
     UNION ALL 
     SELECT filename_housekeeping AS filename 
     FROM housekeeping) AS sq 
GROUP BY sq.filename 
HAVING Count(*) = 1 

測試在SQLFiddle

+0

棒極了,這個作品,謝謝您! – James

0

最簡單的辦法就是非SQL方式

mysqldump DB TableA > TableA.sql 
mysqldump DB TableB > TableB.sql 

現在打開的文件,並替換 「),(」 與 「),\ n(」(即力新行)作爲DIFF預期線,不長串數據

的然後做:

diff TableA.sql TableB.sql 

它應該返回不同的線路

如果有某種類型的ID(它不是從你的問題清楚),你可能需要從文件比較

修訂 所以使用此之前將其刪除:

mysql -u USERNAME --password=PASSWORD --database=DATABASE \ 
--execute='SELECT `FIELD`, `FIELD` FROM `TableA`' -X > TableA.xml 

mysql -u USERNAME --password=PASSWORD --database=DATABASE \ 
--execute='SELECT `FIELD`, `FIELD` FROM `TableB`' -X > TableB.xml 

並再次做一個diff,你可能需要把它打掃乾淨,所以用xmllint --format

+0

感謝您的想法。我明白你的意思,但一張桌子有大約25列,而另一張桌子只有2個。所以我不認爲在這種情況下這是可行的。 – James

+0

謝謝,我真的很感激你的意見。我希望能夠在SQLYog中運行MySQL查詢。 – James

+0

這將是浪費時間,想想看,你是比較15000行與15,010行只發現10是丟失/重複/無論如何,它浪費SQL時間使用SQL這個 – nrathaus

相關問題