mysql запрос - cla sh между не в и / или - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь получить все свои продукты из категорий A c и без некоторых продуктов из этих категорий.

Я сделал этот запрос:

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 cla sh с категориями

Как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Для начала: всегда используйте стандартное соединение (с ключевым словом on), а не неявное объединение старой школы (с запятыми в предложении from): этот старый синтаксис уже не пользуется популярностью десятилетия назад go и не должен использоваться в новом коде.

Тогда: вам нужно несколько условий 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'

Обратите внимание, что я использовал псевдонимы таблиц, чтобы сократить синтаксис. Я также удаляю обратные кавычки вокруг идентификаторов: в большинстве случаев они не нужны и просто делаю запрос менее простым (вы можете добавить их обратно, если это вызывает проблемы).

1 голос
/ 30 мая 2020

Оператор 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%'
...