2015-06-21 64 views
1

我正在使用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') 

上面的函數返回零結果。

使用減去一個查詢提供了一個錯誤:

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 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MINUS (SELECT WP.post_title FROM wp_posts as WP, wp_postmeta as PM WHERE P' at line 4"

的負查詢做工精細兩個部分。第一個結果爲482個結果,第二個結果爲330個結果。

回答

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歲了)。

請注意,連接表上的任何條件都必須在連接條件(而不是where子句)中 - 例如在此例中爲PM.meta_key='_posr_cost_of_good'。如果你把它放在where子句中,你可以強制它加入inner

+0

感謝您的提示,設法讓它與以下工作: SELECT WP.post_title,CONCAT('https://www.tudosaudavel.com/wp-admin/post.php?post=',WP .ID, '和行動=編輯') FROM wp_posts爲WP LEFT JOIN wp_postmeta爲下午PM.post_id = WP.ID AND PM.meta_key = '_ posr_cost_of_good' WHERE WP.post_status = '發佈' 和WP.post_type ='product' AND PM.post_id IS NULL – user3905599

0

你說第一位給了482和第二位330. 你可以嘗試做一個不同的數值產生的第一位和第二位。 可能是,正確的答案是0記錄差異! 只是一個猜測。

+0

實際上,它給出了不同的答案。並且可以毫不費力地找到許多沒有成本信息的項目,只能逐個進行搜索,所以減號或任何其他方式都是最好的。 – user3905599

相關問題