如果主题标题不明确,请注意。这是我的情况:
客户有一个包含135,000个JPG文件的照片库网站。每个文件在MySQL表中都有一行称为“照片”,其中包含“标题”,“描述”,“关键字”,“文件名”等字段......
作为一项管家工作,我已经阅读了存储文件的服务器的内容,这可以带回135,010个文件(比我们所知的多10个)。我已将这些文件的文件名存储在名为“housekeeping”的新表和名为“filename_housekeeping”的字段中。
所以我现在拥有的是2张桌子。一个有135,000行,包含有关我们知道的文件的信息。但是,对服务器的分析显示有135,010个文件。所以10个文件是“孤儿”,可能是过去删除失败的结果。
我想识别这10个文件,所以我需要比较2个表/字段“photos.filename”v“housekeeping.filename_housekeeping”并且只显示“housekeeping”中的10行“照片中不存在” ”。即我正在尝试识别服务器上我们不知道的10个文件的文件名。
希望这很清楚。我已经尝试了一些关于stackoverflow的类似问题的解决方案,但它们并不完全正确。
非常感谢。
詹姆斯。
答案 0 :(得分:0)
最简单的方法是非SQL方式
mysqldump DB TableA > TableA.sql
mysqldump DB TableB > TableB.sql
现在打开文件并替换“),(”with“),\ 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
答案 1 :(得分: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
上进行测试