SQL: выберите, где не существует в другой таблице - PullRequest
0 голосов
/ 09 февраля 2019

У меня одно и то же имя в каждой таблице, но оно все еще выбирает его из таблицы ингредиентов, хотя точное имя находится в таблице ингредиенты_ мастераЕсть идеи почему?

SELECT
    `ingredients`.`id`,
    `ingredients`.`name` 
FROM
    `ingredients` 
WHERE
    `ingredients`.`name` LIKE '%makers%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%jack%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%hennesey%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%bourbon%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%RYE%' ESCAPE '!' 
    AND NOT EXISTS ( 
        SELECT * FROM ingredients_master WHERE ingredients.NAME = ingredients_master.NAME 
    ) 
GROUP BY
    `ingredients`.`name`

1 Ответ

0 голосов
/ 09 февраля 2019

Ваша проблема связана с тем, как вы используете операторы AND и OR: AND имеет более высокий приоритет, чем OR, поэтому это:

WHERE
    `ingredients`.`name` LIKE '%makers%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%jack%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%hennesey%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%bourbon%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%RYE%' ESCAPE '!' 
    AND NOT EXISTS ( 
        SELECT * FROM ingredients_master WHERE ingredients.NAME = ingredients_master.NAME 
    ) 

Фактически эквивалентно:

WHERE
    `ingredients`.`name` LIKE '%makers%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%jack%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%hennesey%' ESCAPE '!' 
    OR `ingredients`.`name` LIKE '%bourbon%' ESCAPE '!' 
    OR (
        `ingredients`.`name` LIKE '%RYE%' ESCAPE '!' 
        AND NOT EXISTS ( 
            SELECT * FROM ingredients_master WHERE ingredients.NAME = ingredients_master.NAME 
        ) 
    )

Таким образом, если любое из первых OR ed условий имеет значение true, результат равен true, независимо от результата условия NOT EXIST.

Возможно, вы хотите:

WHERE
    (
        `ingredients`.`name` LIKE '%makers%' ESCAPE '!' 
        OR `ingredients`.`name` LIKE '%jack%' ESCAPE '!' 
        OR `ingredients`.`name` LIKE '%hennesey%' ESCAPE '!' 
        OR `ingredients`.`name` LIKE '%bourbon%' ESCAPE '!' 
        OR `ingredients`.`name` LIKE '%RYE%' ESCAPE '!' 
    )
    AND NOT EXISTS ( 
        SELECT * FROM ingredients_master WHERE ingredients.NAME = ingredients_master.NAME 
    ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...