我在每个表中都有相同的名称,但它仍然从配料表中选择它,即使确切的名称在 ingredients_master 表中。有什么想法吗?
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`
最佳答案
您的问题与您使用 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
条件中的任何一个为真,则结果为真,与 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
)
关于mysql - SQL:选择其他表中不存在的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54610363/