mysql - 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
任何帮助将不胜感激,以实现我所需要的。
解决方案
我了解您的要求是选择以下id
各项posts
:
要么有相应的记录
cdlr_post_meta
withmeta_key = 'statusCDLR'
和meta_value <> 1
或没有
cdlr_post_meta
记录meta_key = 'statusCDLR'
实现这一点的一个策略是使用 a在withLEFT JOIN
中搜索一条记录,然后在子句中实现其余的逻辑(如果没有对应的记录,则为all的列)。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
s 和AND
s 时,您需要将测试表达式括在括号内以避免遇到优先级问题(AND
优先级高于OR
)。您应该使用显式
JOIN
s 而不是隐式 s。
推荐阅读
- c# - 在完成动作之前等待设定的时间,循环
- bash - 如何使用&&将多个命令传递给bash中的单个命令?
- python - 使用范围函数将字符串分配给变量
- .net-core - vscode 开始调试什么都不做
- google-app-engine - 搜索元数据的应用程序架构
- python-3.x - 我试图使用我制作的类(车辆和客户),但我得到“TypeError:object()不带参数”。我究竟做错了什么?
- reactjs - 如何使用材质 UI 和样式化组件将链接文本更改为粗体且不带下划线?
- numpy - 如何通过矢量化实现将索引列表转换为 numpy 中的单元格列表(numpy 列表数组)?
- apache-spark - 使用 spark-sql 进行查询时显示列名
- java - 该对象未添加到 ArrayList。如何解决这个问题?