Skip to content
Advertisement

mysql query – clash between not in and/or

I’m trying to get all my products , from A specific categories and without some products from those categories .

i did this query:

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%%')

The problem is that i’m still getting products with the string ‘SPLA’ or ‘SA OLP’ – because the NOT IN clash with the categories

How to solve it ?

Advertisement

Answer

As a starter: always use standard join (with the on keyword) rather than old-school implicit joins (with commas in the from clause): this old syntax has fallen out of favor decades ago and should not be used in new code.

Then: you need multiple like conditions rather than in. If you have many values, regexp matching comes handy to shorten the syntax:

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'

Note that I used table aliases to shorten the syntax. I also remove the backticks around identifiers: most of the time they are not needed, and just make the query less easy to follow (you can add them back if this causes issues).

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement