如果主题标题不清楚,很抱歉。这是我的情况:
客户有一个图片库网站,里面有135000个JPG文件。每个文件在MySQL表中都有一行,称为"照片",其中包含"标题"、"描述"、"关键字"、"文件名"等字段。。。
作为一项内务管理练习,我已经阅读了存储文件的服务器的内容,这会带回135010个文件(即比我们所知道的多10个)。我已经将这些文件的文件名存储在一个名为"内务管理"的新表和一个名"filename_housebkeeping"的字段中。
所以我现在有两张桌子。其中一个有135000行,包含我们已知存在的文件的信息。但是,对服务器的分析显示有135010个文件。因此,10个文件是"孤儿",可能是过去删除失败的结果。
我想识别这10个文件,所以我需要比较两个表/字段"photos.filename"v"househouskeeping",只显示"househouting"中不存在于"photos"中的10行。即,我正在尝试识别服务器上我们不知道的10个文件的文件名。
希望这是清楚的。我在stackoverflow上尝试过一些类似问题的解决方案,但都不太正确。
非常感谢。
詹姆斯。
这将使行只存在于其中一个表中,而不存在于另一个表,从而避免代价高昂的联接或重复的子查询:
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
最简单的方法是非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