将2个MySQL表与公共字段进行比较,识别仅在1个表中的数据

时间:2013-12-17 08:05:24

标签: php mysql sql

如果主题标题不明确,请注意。这是我的情况:

客户有一个包含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的类似问题的解决方案,但它们并不完全正确。

非常感谢。

詹姆斯。

2 个答案:

答案 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 

SQLFiddle

上进行测试