【问题标题】:SQL condition if doesn't existSQL条件如果不存在
【发布时间】:2019-01-16 18:28:55
【问题描述】:

所以我有这个 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

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

【问题讨论】:

标签: mysql wordpress woocommerce


【解决方案1】:

我了解您的要求是选择posts 中的id

  • 任一cdlr_post_meta有对应的记录meta_key = 'statusCDLR'meta_value &lt;&gt; 1

  • 没有cdlr_post_metameta_key = 'statusCDLR'的记录

实现这一点的一个策略是使用LEFT JOINcdlr_post_metameta_key = 'statusCDLR'中搜索一条记录,然后在WHERE子句中实现其余的逻辑(如果没有对应的记录,pm的列都是NULL)。

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 而不是隐式的。

【讨论】:

  • @Ered : 我更改了查询,请再检查一次。
  • 我尝试了你的代码,但即使 meta_key =_statusCDLR 和 meta_value = 1,ID 仍然显示
  • 接缝问题出在此处:OR ( pm.meta_key &lt;&gt; '_statusCDLR' ) 如果我删除那条线它可以工作,但我回到正方形 1
  • @Ered : 此查询不选择 meta_key 为 statusCDLR 且 meta_value 为 1 的记录...也许检查您的测试数据?
  • 我的目标是显示包含 meta_key=statusCDLRmeta_value=0 的 ID,或者如果 meta_key=statusCDLR 不存在,认为你可以帮助我,因为你看到我使用 wordpress 结构......如果 meta_value=1,您的查询仍会显示 ID,但它不应该显示。
猜你喜欢
  • 2013-10-22
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 2020-02-20
  • 2011-01-14
相关资源
最近更新 更多