所以我有这个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
任何帮助将不胜感激,以实现我所需要的。
最佳答案
我了解您的要求是选择id
的posts
:
在cdlr_post_meta
中具有meta_key = 'statusCDLR'
和meta_value <> 1
的对应记录
或没有cdlr_post_meta
记录meta_key = 'statusCDLR'
实现此目的的策略是使用LEFT JOIN
在cdlr_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的常规说明:
混合
OR
和AND
时,需要将测试表达式括在括号内,以避免遇到优先问题(AND
的优先级高于OR
)。您应该使用显式
JOIN
而不是隐式的。