所以我有这个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的IDS,但我没有运气尝试过这种方法:

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


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

最佳答案

我了解您的要求是选择idposts


cdlr_post_meta中具有meta_key = 'statusCDLR'meta_value <> 1的对应记录
或没有cdlr_post_meta记录meta_key = 'statusCDLR'


实现此目的的策略是使用LEFT JOINcdlr_post_meta中使用meta_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的常规说明:


混合ORAND时,需要将测试表达式括在括号内,以避免遇到优先问题(AND的优先级高于OR)。
您应该使用显式JOIN而不是隐式的。

08-16 15:21