SQL关联两张表设置多WHERE条件时conversions.status筛选不生效问题
错误原因
你的SQL存在两处核心问题,导致conversions.status过滤条件不生效:
1. 条件写法错误
conversions.status = ('approved' or 'pending')不符合SQL语法逻辑:OR是布尔运算符,执行时会先计算括号内'approved' or 'pending'的结果,非空字符串在数据库中会被判定为真,最终括号内返回布尔值true,你的条件实际等价于conversions.status = true,自然匹配不到任何符合要求的记录。
正确写法二选一即可:
- 使用
IN运算符:conversions.status IN ('approved', 'pending') - 拆分条件:
conversions.status = 'approved' OR conversions.status = 'pending'
2. 左连接过滤条件位置错误
你使用LEFT JOIN关联conversions表,却把该表的过滤条件写在WHERE子句中,会直接让左连接失效:左连接中没有匹配到转换记录的行,所有conversions相关字段都是NULL,WHERE子句对conversions.status的判断会直接过滤掉这些NULL行,最终等价于INNER JOIN conversions的效果。
如果你需要保留所有符合要求的点击记录、无论是否有对应转换,需要把conversions的过滤条件移到LEFT JOIN的ON子句中;如果你确实只需要返回有符合状态转换的点击记录,直接把LEFT JOIN改为INNER JOIN即可,避免逻辑歧义。
修正后的代码示例(保留左连接逻辑)
SELECT clicks.offer_id, clicks.offer_name, clicks.country, clicks.device_type, clicks.os_name, conversions.name , clicks.ip_address as Session, conversions.conversion_ip as Conversion, conversions.currency as Currency , conversions.payout as Payout FROM clicks JOIN users ON clicks.affiliate_id = users.id LEFT JOIN conversions ON clicks.transaction_id = conversions.click_transaction_id AND conversions.status IN ('approved', 'pending') WHERE clicks.affiliate_id = '2' AND date(clicks.created_at) BETWEEN '2021-11-08' AND '2021-12-07'
内容的提问来源于stack exchange,提问作者Eva Glaude
相关产品推荐
相关产品推荐

