SQL查询添加标题含指定词汇的WHERE子句报错求助
嘿,我来帮你搞定这个SQL语法问题!你遇到的错误核心是重复使用了WHERE关键字——SQL里一个SELECT语句只能有一个WHERE子句,所有过滤条件都得用AND/OR这类逻辑运算符放在同一个子句里,不能重复写WHERE。
另外还要注意AND和OR的优先级问题,不加括号的话,AND会比OR先执行,很可能导致你的查询逻辑和预期不符。下面分两种常见需求给你正确的写法:
需求1:同时满足原有条件 + 标题包含指定词汇
比如你要找program_type_id为2、关联食谱可用并且标题包含“烘焙”的记录,写法如下(把%烘焙%替换成你要的指定词汇,%是SQL里的通配符,代表任意长度的字符):
SELECT * FROM program_recipes ptr LEFT JOIN recipes r ON ptr.recipe_id = r.id WHERE ptr.program_type_id IN (2) AND r.available = 1 AND r.title LIKE '%烘焙%';
这里提一句:因为你加了r.available = 1,原本的左连接其实已经和内连接效果一致了——左连接中没有匹配到食谱的program_recipes记录,r.available会是NULL,NULL = 1不成立,会被过滤掉。如果你不需要保留这类无匹配的记录,也可以直接写成内连接:
SELECT * FROM program_recipes ptr INNER JOIN recipes r ON ptr.recipe_id = r.id WHERE ptr.program_type_id IN (2) AND r.available = 1 AND r.title LIKE '%烘焙%';
需求2:满足原有条件 或者 标题包含指定词汇
如果你的逻辑是“符合原有筛选规则,或者标题包含指定词汇”,一定要用括号把原有条件括起来,保证逻辑优先级:
SELECT * FROM program_recipes ptr LEFT JOIN recipes r ON ptr.recipe_id = r.id WHERE (ptr.program_type_id IN (2) AND r.available = 1) OR r.title LIKE '%烘焙%';
这里要注意:左连接中没有匹配到食谱的记录,r.title会是NULL,NULL LIKE '%xxx%'不会成立,所以这类记录不会被选中。如果需要调整这个逻辑,可以再针对性修改。
内容的提问来源于stack exchange,提问作者Jaan
相关产品推荐
相关产品推荐

