mysql查询-not in和/或之间的冲突

d6kp6zgx  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(385)

我试图得到我所有的产品,从一个特定的类别,没有一些产品从这些类别。
我做了这个查询:

SELECT `ps_product`.`id_product`,`ps_product_lang`.`name` 
FROM `ps_product`, `ps_product_lang` 
WHERE  
    `ps_product`.`id_product` = `ps_product_lang`.`id_product`
    AND `ps_product`.`id_manufacturer` NOT IN (3,7,10,11,13,14,19,22,23,24,25,30,31,32,33,34,37,38,41,42,43,44,45,46,47,48,49,50) 
    AND `ps_product_lang`.`name` not in ( '%OLP%' ,'%LicSAPk%' ,'%SPLA%','%SA OLP%')

问题是,我仍然得到字符串'spla'或'sa olp'的产品,因为它们与类别不冲突
如何解决?

ikfrs5lh

ikfrs5lh1#

作为初学者:始终使用标准连接(与 on 关键字)而不是老式的隐式连接(在 from 子句):这种旧语法在几十年前就不受欢迎了,不应该在新代码中使用。
然后:你需要多个 like 条件而不是 in . 如果有许多值,regexp匹配可以方便地缩短语法:

SELECT p.id_product,pl.name 
FROM ps_product p
INNER JOIN ps_product_lang pl ON p.id_product = pl.id_product
WHERE  
    p.id_manufacturer not in (3, 7, 10, 11, 13, 14, 19, 22, 23, 24, 25, 30, 31, 32, 33, 34, 37, 38, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50) 
    AND pl.name not regexp 'OLP|LicSAPk|SPLA|SA OLP'

注意,我使用了表别名来缩短语法。我还删除了标识符周围的反勾号:大多数情况下它们是不需要的,只是使查询不那么容易理解(如果这会导致问题,可以将它们添加回去)。

thigvfpy

thigvfpy2#

接线员 IN 用于精确匹配值,而不是部分匹配值列表。所以你不能像这样使用通配符 '%' .
你得用接线员 LIKE 对于每个值:

AND `ps_product_lang`.`name` not like '%OLP%' 
AND `ps_product_lang`.`name` not like '%LicSAPk%' 
AND `ps_product_lang`.`name` not like '%SPLA%'
AND `ps_product_lang`.`name` not like '%SA OLP%'

相关问题