2012-02-26 126 views
1

我有一個數據庫應用程序,我正在爲汽車產品工作。MySQL在哪裏和或

我想退貨產品結果相匹配的條件:

  • 「製作」必須匹配
  • 的「類別」必須匹配
  • 但是當它到達的「選項」,它可以是或者全部。我希望它返回有選擇

我使用一個或所有的期權產品:

SELECT * 
FROM `PRODUCTS` 
WHERE `MAKE` LIKE '%CHEV%' 
AND `CATEGORY` LIKE '%BUMPERS%' 
AND `OPTIONS` LIKE '%TOW HOOKS%' 
OR `OPTIONS` LIKE '%LIGHT MOUNT HOLES%' 

當我使用這個它的工作原理,但來自不同品牌,以及它產生的結果。所以它是從福特回來的產品說,以及...我不希望這一點。

我希望MAKE和CATEGORY是嚴格的(它們必須匹配),但OPTIONS可以是一個或兩個 - 或者甚至可以是三個或四個不同的選項 - 但至少有一個選項必須匹配。

OPTIONS提交的是一個由管道字符分隔的字符串,即LIGHT MOUNT HOLES|TOW HOOKS|FOUR DOOR,我不想更改它。

如果我使用上面的查詢與搜索只是一個選項:

AND `OPTIONS` LIKE '%TOW HOOKS%'" or just "AND `OPTIONS` LIKE '%LIGHT MOUNT HOLES%' 

...它完美的作品。但是,如果我嘗試搜索多個選項,它會開始從不同的MAKES中帶回產品。

我也曾嘗試:

SELECT * 
FROM `PRODUCTS` 
WHERE `MAKE` LIKE '%CHEV%' 
AND `CATEGORY` LIKE '%BUMPERS%' 
OR `OPTIONS` LIKE '%TOW HOOKS%' 
OR `OPTIONS` LIKE '%LIGHT MOUNT HOLES%' 

並且有多個同樣的問題,使顯示出來。

回答

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子句組合在一起的區別。這意味着它們實質上只是製造和類別旁邊的一個條件。你需要考慮的事情是邏輯與/或與我們在英語中使用它們不一樣。在您的查詢中,如果某輛車有'%LIGHT MOUNT HOLES%'等選項,則表示條件已滿足。假設M(make),C(類別),O1(option1),O2(option2)表示查詢中的4個子句,R是評估它們的結果。然後R = M和C以及O1或O2。如果O2是真的,那麼M,C和O1是無關緊要的。因定義而異X =如果A或B爲真,則A或B爲真。你想要的是R = M AND C AND(O1或O2 OR ...)。這種方式只有當M,C和至少一個Os的全部爲真時,R纔是真實的。

+0

非常感謝你的答覆。 我可以要求解釋嗎? 它是否像海報「Kolink」所說的關於數學運算順序? – 2012-02-27 03:59:14

+0

@ user1005858,請參閱編輯。 – Isaac 2012-02-27 04:07:10

+0

@ user1005858,剛剛更新了第二個查詢,如果你想放鬆選項匹配,就把它全部放在一起。 – Isaac 2012-02-27 04:12:03

3

你在做什麼比得上有:

3 * 4 + 5 

並期待27。但由於操作員的優先順序,答案是17

可以「修復」這一點,並得到27像這樣:

3 * (4 + 5) 

確切同樣適用於多種編程語言,和MySQL也不例外。

將您的OR選項放在括號內,以便將它們視爲一組。

+0

謝謝你 - 這個也是正確的 - 上面的例子 - 在MYSQL中 - 我認爲其他讀者會從中得到更多。儘管你的回答也是正確的。 – 2012-02-27 06:08:40

1

我的教育猜測是它是OR的錯,因爲它的計算方法如(this AND that AND that AND that) OR something。您可以通過檢查所有返回的不同產品是否包含OR中的條件來確認。

至於解決它:你可以使用括號:this AND that AND (that OR something_else)

+0

非常感謝你 – 2012-02-27 06:33:49