首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个MySQL表与公共字段进行比较,确定仅在其中一个表中的数据

将两个MySQL表与公共字段进行比较,确定仅在其中一个表中的数据
EN

Stack Overflow用户
提问于 2013-12-17 08:05:24
回答 2查看 110关注 0票数 0

如果题目不清楚,很抱歉。以下是我的情况:

客户端有一个包含13.5万个JPG文件的照片库网站。每个文件都有一个名为“照片”的MySQL表中的一行,其中包含“标题”、“描述”、“关键字”、“文件名”等字段.

作为一项内务管理练习,我已经阅读了存储文件的服务器的内容,它带回了135,010个文件(也就是说,比我们所知道的还要多10个)。我已经将这些文件的文件名存储在一个名为“内务管理”的新表和一个名为"filename_housekeeping“的字段中。

所以我现在有两张表。其中一个有135,000行,包含关于我们已知存在的文件的信息。但是,对服务器的分析显示,有135,010个文件。所以10个文件是“孤儿”,很可能是过去删除失败的结果。

我想识别这10个文件,所以我需要比较两个表/字段"photos.filename“v "housekeeping.filename_housekeeping”,并且只显示“内务管理”中“照片”中不存在的10行。也就是说,我试图识别我们不知道的服务器上的10个文件的文件名。

希望这是清楚的。我尝试过一些类似的关于堆栈溢出的问题的解决方案,但它们并不完全正确。

非常感谢。

詹姆斯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 08:58:31

这将使您的行只存在于其中一个表中,而不存在于另一个表中,从而避免代价高昂的联接或重复的子查询:

代码语言:javascript
复制
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上测试

票数 0
EN

Stack Overflow用户

发布于 2013-12-17 08:09:06

最简单的方法是非SQL方式。

代码语言:javascript
复制
mysqldump DB TableA > TableA.sql
mysqldump DB TableB > TableB.sql

现在打开文件并替换")、(“与")、\n(即强制换行符),正如diff所期望的行,而不是长字符串的数据。

那就做:

代码语言:javascript
复制
diff TableA.sql TableB.sql

它应该返回不同的行。

如果有某种ID (从您的问题中看不清楚),您可能需要在比较之前将其从文件中删除。

更新了,因此请使用以下内容:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20628903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档