首页 > 解决方案 > SQL条件如果不存在

问题描述

所以我有这个 SQL 查询:

SELECT 
    p.ID
FROM 
    `cdlr_posts` p, 
    cdlr_postmeta pm 
WHERE 
    pm.post_id=p.ID AND 
    `post_type` = 'shop_order' AND
    pm.meta_key = '_statusCDLR' AND
    pm.meta_value <> 1 
group by
    p.ID

我需要的是显示所有符合这些条件的 IDS,但我也想显示不包含“_statusCDLR”的那些meta_key我尝试过这样的事情但没有运气:

WHERE 
    pm.post_id=p.ID AND 
    `post_type` = 'shop_order' AND
    (pm.meta_key = '_statusCDLR' AND pm.meta_value <> 1 OR pm.meta_key <> '_statusCDLR') 
group by

任何帮助将不胜感激,以实现我所需要的。

标签: mysqlwordpresswoocommerce

解决方案


我了解您的要求是选择以下id各项posts

  • 要么有相应的记录cdlr_post_metawithmeta_key = 'statusCDLR'meta_value <> 1

  • 没有cdlr_post_meta记录meta_key = 'statusCDLR'

实现这一点的一个策略是使用 a在withLEFT JOIN中搜索一条记录,然后在子句中实现其余的逻辑(如果没有对应的记录,则为all的列)。cdlr_post_metameta_key = 'statusCDLR'WHEREpmNULL

SELECT p.ID
FROM cdlr_posts p
LEFT JOIN cdlr_postmeta pm 
    ON pm.post_id = p.ID AND pm.meta_key = '_statusCDLR'
WHERE 
    p.post_type = 'shop_order'
    AND ( pm.post_id IS NULL OR pm.meta_value <> 1 )
GROUP BY p.ID

PS - 关于您的 sql 的一般说明:

  • 混合 ORs 和ANDs 时,您需要将测试表达式括在括号内以避免遇到优先级问题(AND优先级高于OR)。

  • 您应该使用显式JOINs 而不是隐式 s。


推荐阅读