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

时间:2016-09-24 02:01:20

标签: wordpress inner-join notin

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

enter image description here

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

ATTEMPT:

{{1}}

这不起作用。无论" AND NOT'是否返回相同的值。 =" 3"包含与否。我想要得到' b' =" 3"条件消除返回集合中的id。

任何帮助?

THX!

1 个答案:

答案 0 :(得分:0)

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

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,我的实际目标是获取所有已发布的帖子的URL,这些帖子没有添加Yoast SEO关键字(需要工作的帖子)。这似乎可以解决问题:

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

注意:网址假定您的永久链接设置基于"帖子名称"。

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