如果题目不清楚,很抱歉。以下是我的情况:
客户端有一个包含13.5万个JPG文件的照片库网站。每个文件都有一个名为“照片”的MySQL表中的一行,其中包含“标题”、“描述”、“关键字”、“文件名”等字段.
作为一项内务管理练习,我已经阅读了存储文件的服务器的内容,它带回了135,010个文件(也就是说,比我们所知道的还要多10个)。我已经将这些文件的文件名存储在一个名为“内务管理”的新表和一个名为"filename_housekeeping“的字段中。
所以我现在有两张表。其中一个有135,000行,包含关于我们已知存在的文件的信息。但是,对服务器的分析显示,有135,010个文件。所以10个文件是“孤儿”,很可能是过去删除失败的结果。
我想识别这10个文件,所以我需要比较两个表/字段"photos.filename“v "housekeeping.filename_housekeeping”,并且只显示“内务管理”中“照片”中不存在的10行。也就是说,我试图识别我们不知道的服务器上的10个文件的文件名。
希望这是清楚的。我尝试过一些类似的关于堆栈溢出的问题的解决方案,但它们并不完全正确。
非常感谢。
詹姆斯。
发布于 2013-12-17 08:58:31
这将使您的行只存在于其中一个表中,而不存在于另一个表中,从而避免代价高昂的联接或重复的子查询:
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上测试
发布于 2013-12-17 08:09:06
最简单的方法是非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再做一次区分,您可能需要整理它,所以使用xmllint --format
https://stackoverflow.com/questions/20628903
复制相似问题