MySQL在哪里和OR

时间:2012-02-26 23:31:51

标签: mysql

我有一个数据库应用程序,我正在研究汽车产品。

我希望返回的产品结果符合以下条件:

  • 'MAKE'必须匹配
  • 'CATEGORY'必须匹配
  • 但是当它进入'OPTIONS'时,它可以是其中之一或全部。我希望它返回具有所选选项中的一个或全部的产品

我正在使用:

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出现的相同问题。

3 个答案:

答案 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)