清理疑問的話,我做了一個PHP腳本,將產生以下SQL查詢:SQL垃圾收集VS在PHP
SELECT * FROM icecream WHERE
flavor = 'vanilla' AND color = 'purple' AND (quality = 'aaa')
OR flavor = 'marzipan' AND color = 'purple' AND (quality = 'aaa')
OR flavor = 'vanilla' AND color = 'purple' AND (quality = 'aaa')
查詢的最後和第一位是相同的。
這看起來我錯了,明明我寧願想運行一個查詢像
SELECT * FROM icecream WHERE
flavor = 'vanilla' AND color = 'purple' AND (quality = 'aaa')
OR flavor = 'marzipan' AND color = 'purple' AND (quality = 'aaa')
省略了最後一排。
這看起來很好在這個例子中,但讓我們說, 1.有可能是23「或味道......」部分,而不是 2 100種不同口味 3. 50種不同的顏色 4. 20種不同的質量等級。
突然間,創建一個漂亮的SQL查詢變得複雜得多,而且沒有重複請求相同的數據。
當前的SQL查詢有效。但是,我應該清理查詢以消除重複,還是應該將其留給SQL引擎來爲我做?
我的意思是,我可以做到這一點......但它值得嗎?一方面,我想傳遞乾淨的SQL查詢,但另一方面,這些類似的事情似乎是SQL引擎真正設計的目的。
有什麼建議嗎?
請注意:僅僅因爲'OR'在一個新的行上,它不會使您的SQL段成爲一個單獨的條件。如果沒有括號(( AND/OR )),則評估將是連續的。另外,你可能想看看['IN'運算符](http://www.w3resource.com/mysql/comparision-functions-and-operators/in-function.php) –
當然,我只是爲了可讀性而做到這一點,所以人們很容易看到重複。 我想過使用IN運算符和一個ID使用所有三個不同的部分。 xxxyyzz 其中x =風味,y =顏色,z =質量。 這可能是一個簡單的解決方案,但存在可擴展性問題。如果其中一個值的數量增加到包括一個額外的數字,那麼整個系統需要重新工作。 –
是的,我希望它是連續的。質量='aaa'和質量='aa'的ID會有所不同,所以它是正確的。 另外,因爲可以有100種口味* 50種顏色= 5000種不同的ID,因爲在aaa和aa上沒有使用圓括號,因爲質量可能會膨脹到10000個不同的ID,當我想要的只是2個冰淇淋的ID。 –