抱歉,主题标题不清楚。这是我的情况:

客户有一个包含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张在“ photos”中不存在的行。即我正在尝试识别服务器上我们不知道的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上测试

09-05 13:27