我有一个数据库应用程序,我正在研究汽车产品。
我希望返回的产品结果符合以下条件:
我正在使用:
SELECT *
FROM `PRODUCTS`
WHERE `MAKE` LIKE '%CHEV%'
AND `CATEGORY` LIKE '%BUMPERS%'
AND `OPTIONS` LIKE '%TOW HOOKS%'
OR `OPTIONS` LIKE '%LIGHT MOUNT HOLES%'
当我使用它时,它可以工作,但它也会产生不同MAKES的结果。所以它也是从FORD那里回来的产品......我不想那样。
我希望MAKE和CATEGORY是严格的(它们必须匹配)但OPTIONS可以是一个或两个 - 或者甚至是三个或四个不同的选项 - 但至少有一个选项必须匹配。
OPTIONS
字段是由管道字符分隔的字符串,即LIGHT MOUNT HOLES|TOW HOOKS|FOUR DOOR
,我不想更改此内容。
如果我在搜索中仅使用上述查询中的一个OPTION:
AND `OPTIONS` LIKE '%TOW HOOKS%'" or just "AND `OPTIONS` LIKE '%LIGHT MOUNT HOLES%'
......它完美无缺。但是,如果我尝试搜索多个OPTIONS,它会开始从不同的MAKES中恢复产品。
我也尝试过:
SELECT *
FROM `PRODUCTS`
WHERE `MAKE` LIKE '%CHEV%'
AND `CATEGORY` LIKE '%BUMPERS%'
OR `OPTIONS` LIKE '%TOW HOOKS%'
OR `OPTIONS` LIKE '%LIGHT MOUNT HOLES%'
并且出现了多个MAKES出现的相同问题。
答案 0 :(得分:6)
SELECT *
FROM `PRODUCTS`
WHERE `MAKE` LIKE '%CHEV%'
AND `CATEGORY` LIKE '%BUMPERS%'
AND (`OPTIONS` LIKE '%TOW HOOKS%'
OR `OPTIONS` LIKE '%LIGHT MOUNT HOLES%'
OR ...)
这将匹配至少一个选项。
如果您还想要返回没有匹配使用选项的汽车:
SELECT *
FROM `PRODUCTS`
WHERE `MAKE` LIKE '%CHEV%'
AND `CATEGORY` LIKE '%BUMPERS%'
修改强>
说明:这与你所拥有的不同之处在于所有LIKE子句都被组合在一起。这意味着它们实质上只是品牌和类别旁边的一个条件。你需要解决的问题是逻辑AND / OR与我们在英语中使用它们不一样。在您的查询中,如果汽车有'%LIGHT MOUNT HOLES%'等选项,则符合条件。
设M(make),C(类别),O1(选项1),O2(选项2)表示查询中的4个子句,R是评估它们的结果。然后R = M AND C和O1或O2。如果O2为真,则M,C和O1无关紧要。因为定义X =如果A或B为真,则OR B为真。你想要的是R = M AND C AND(O1 OR O2 OR ...)。这样,只有当M,C和至少一个Os都为真时,R才为真。
答案 1 :(得分:3)
您正在做的事情与:
相当3 * 4 + 5
并期待27
。但由于运算符的优先顺序,答案是17
。
你可以“修复”这个并获得27
,如下所示:
3 * (4 + 5)
完全相同的情况适用于许多编程语言,MySQL也不例外。
将OR
选项放在括号中,以便将它们视为一个组。
答案 2 :(得分:1)
我受过良好教育的猜测是OR
的错误,因为它的评估类似于(this AND that AND that AND that) OR something
。您可以通过检查所有返回的不同品牌是否包含OR
的条件来确认。
至于解决问题:您可以使用括号:this AND that AND (that OR something_else)
。