如何在两个表中查找匹配的行,在第二个表中不存在

时间:2015-06-21 23:03:16

标签: mysql woocommerce

我正在使用woocommerce和一个可以节省产品成本的插件。我正在试图找出哪些产品没有注册此信息。

所以我现在有两个SQL工作正常,一个返回所有产品,另一个只返回有成本信息的产品。

我正在尝试制作一个减号,以便在没有成本信息的情况下获得产品清单。问题是查询不起作用。我尝试了不同的东西:

SELECT WP.post_title
FROM wp_posts as WP, wp_postmeta as PM
WHERE PM.meta_key='_posr_cost_of_good'
and PM.post_id=WP.ID
and WP.post_status='publish'
and WP.post_type='product' NOT in (
    SELECT WP.post_title
    FROM wp_posts as WP
    where  WP.post_status='publish'
    and WP.post_type='product' )

以上返回零结果。

使用MINUS的下一个查询会出错:

SELECT WP.post_title
FROM wp_posts as WP
where WP.post_status='publish'
and WP.post_type='product'
MINUS
SELECT WP.post_title
FROM wp_posts as WP, wp_postmeta as PM
WHERE PM.meta_key='_posr_cost_of_good'
and PM.post_id=WP.ID
and WP.post_status='publish'
and WP.post_type='product'

错误是:

  

1064 - 您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在'MINUS附近使用正确的语法(选择WP.post_title FROM wp_posts as WP,wp_postmeta as PM WHERE P'at line 4“

MINUS查询的两个部分都可以正常工作。第一个给出482个结果,第二个给出结果中的330行。

2 个答案:

答案 0 :(得分:0)

在没有匹配数据的情况下查找行的标准有效方法是使用左连接和过滤器来连接空值。

我很确定这会奏效:

SELECT WP.post_title
FROM wp_posts as WP
LEFT JOIN wp_postmeta as PM ON PM.post_id=WP.ID
    AND PM.meta_key='_posr_cost_of_good'
WHERE WP.post_status='publish'
AND PM.post_id IS NULL

请注意,您必须使用正确的连接来执行此操作(无论如何您应该使用它 - 该语法现已超过20年)。

请注意,联接表上的任何条件都必须位于 join 条件(而不是where子句)中 - 例如,在本例中为PM.meta_key='_posr_cost_of_good'。如果将其放在where子句中,则会强制它进入内部连接。

答案 1 :(得分:0)

你说第一位给了482,第二位给了330。 你能尝试对第一位和第二位产生的值进行明确计算。 可能是,正确答案是0记录差异! 只是一个猜测。