mysql 查询 - 不在 and/or 之间的冲突
mysql query - clash between not in and/or
我正在尝试从特定类别中获取我的所有产品,但没有这些类别中的某些产品。
我做了这个查询:
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' 的产品 - 因为 NOT IN 与类别
冲突
如何解决?
运算符 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%'
作为入门者:始终使用标准连接(使用 on
关键字)而不是老式的隐式连接(在 from
子句中使用逗号):这种旧语法已经过时了几十年前的青睐,不应在新代码中使用。
然后:您需要多个 like
条件而不是 in
。如果您有很多值,正则表达式匹配可以方便地缩短语法:
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'
请注意,我使用 table 别名来缩短语法。我还删除了标识符周围的反引号:大多数时候不需要它们,只是让查询不那么容易理解(如果这会导致问题,您可以将它们添加回来)。
我正在尝试从特定类别中获取我的所有产品,但没有这些类别中的某些产品。
我做了这个查询:
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' 的产品 - 因为 NOT IN 与类别
冲突如何解决?
运算符 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%'
作为入门者:始终使用标准连接(使用 on
关键字)而不是老式的隐式连接(在 from
子句中使用逗号):这种旧语法已经过时了几十年前的青睐,不应在新代码中使用。
然后:您需要多个 like
条件而不是 in
。如果您有很多值,正则表达式匹配可以方便地缩短语法:
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'
请注意,我使用 table 别名来缩短语法。我还删除了标识符周围的反引号:大多数时候不需要它们,只是让查询不那么容易理解(如果这会导致问题,您可以将它们添加回来)。