如果某个字段值出现在另一个表中,则从一个表中排除记录

Posted

技术标签:

【中文标题】如果某个字段值出现在另一个表中,则从一个表中排除记录【英文标题】:Exclude records from SELECT from one table if a certain field value appears in another table 【发布时间】:2016-09-24 02:01:20 【问题描述】:

我真正想做的是识别所有 WordPress 帖子 ID(来自 wp_posts),其中在 wp_postmeta 中不存在 Yoast SEO 焦点关键字记录。这是问题的简化版本:

想要返回 T1.id 值 2,6 -- 即:仅 T1.id 的值等于 T2.fid,其中 T1.a = "2" 并且 T2.b 不等于 "3 ”。

尝试:

SELECT DISTINCT id FROM `T1` INNER JOIN `T2` ON `id` = `fid` 
WHERE `a` = "2" AND NOT `b` = "3" ORDER BY ID ASC

这不起作用。无论是否包含“AND NOT 'b' = "3",都会返回相同的值。我正在尝试获取 'b' = "3" 条件以从返回的集合中消除 id。

有什么帮助吗?

谢谢!

【问题讨论】:

【参考方案1】:

好的 - 我想我想通了。首先,发布的问题的答案是:

SELECT DISTINCT `id` FROM `T1` INNER JOIN `T2`
ON `id` = `fid`
WHERE `a` = "2" 
AND `fid` NOT IN (SELECT `fid` FROM `T2` WHERE `b` = "3")
ORDER BY `id` ASC

对于您的 WordPress SEO,我的实际目标是获取所有未添加 Yoast SEO 关键字的已发布帖子的 URL(需要工作的帖子)。这似乎可以解决问题:

SELECT DISTINCT `ID`, CONCAT("http://mysite/",`post_name`) , `post_type`,  `post_status`
FROM `wp_posts` INNER JOIN `wp_postmeta` ON `post_id` = `ID`
WHERE `post_type` = "post"  AND `post_status` = "publish"
AND `post_id` NOT IN
(SELECT `post_id` FROM `wp_postmeta` WHERE `meta_key` = "_yoast_wpseo_focuskw")
ORDER BY `ID` ASC

注意:该 URL 假定您的永久链接设置基于“帖子名称”。

如果您想检查“页面”或自定义帖子类型,只需将post_type 设置为适当的值。

【讨论】:

以上是关于如果某个字段值出现在另一个表中,则从一个表中排除记录的主要内容,如果未能解决你的问题,请参考以下文章

从表中删除记录,如果其特定值未出现在另一个表中

如果值存在于多个表中,则从表中获取结果

如果所有记录都等于特定值,则从一个表中删除记录

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

sql 如何判断表中的某个字段是不是有某个值

Mysql 为每一行检查是不是一个字段在另一个表中,如果不删除该行