2013-02-14 40 views
1

我正在開發一個花壇種植系統,並且已經編寫了一個查詢8個表的SQL語句,以便返回一個合適的植物列表。SQL查詢不返回標準集

表結構:http://pastebin.com/0DUYQis1 [從phpmyadmin的輸出]

實施例的數據:http://gyazo.com/13dad0b3370b5053dbcad2a32013a54a/http://gyazo.com/1bd313adb3e8ccd01354c979e69fd059

SQL語句:

SELECT Plant.Plant_ID, Plant.Plant_Quantity, Plant.Plant_Price, Plant.Plant_Description, Plant.Plant_Latin_Name, Plant.Plant_Common_Name, Plant.Plant_Height, Plant.Plant_Spread, Plant.Plant_Type, Plant.Plant_Family, Plant.Plant_Picture, Plant_Aspect.Plant_Aspect, Plant_Flower_Colour.Plant_Flower_Colour, Plant_Flower_Colour.Plant_Season, Plant_Foliage_Colour.Plant_Foliage_Colour, Plant_Foliage_Colour.Plant_Season, Plant_Moisture.Plant_Moisture, Plant_Soil_PH.Plant_Soil_PH, Plant_Soil_Type.Plant_Soil_Type, Plant_Sun_Type.Plant_Sun_Type 

FROM Plant 

INNER JOIN Plant_Aspect ON Plant.Plant_ID = Plant_Aspect.Plant_ID 
INNER JOIN Plant_Flower_Colour ON Plant.Plant_ID = Plant_Flower_Colour.Plant_ID 
INNER JOIN Plant_Foliage_Colour ON Plant.Plant_ID = Plant_Foliage_Colour.Plant_ID 
INNER JOIN Plant_Moisture ON Plant.Plant_ID = Plant_Moisture.Plant_ID 
INNER JOIN Plant_Soil_PH ON Plant.Plant_ID = Plant_Soil_PH.Plant_ID 
INNER JOIN Plant_Soil_Type ON Plant.Plant_ID = Plant_Soil_Type.Plant_ID 
INNER JOIN Plant_Sun_Type ON Plant.Plant_ID = Plant_Sun_Type.Plant_ID 

WHERE Plant_Aspect.Plant_Aspect = 'East-facing' 
OR Plant_Aspect.Plant_Aspect = 'Any' 
AND Plant_Soil_Type.Plant_Soil_Type = 'Sand' 
OR Plant_Soil_Type.Plant_Soil_Type = 'Any' 
AND Plant_Moisture.Plant_Moisture = 'Well-drained' 
OR Plant_Moisture.Plant_Moisture = 'Any' 
AND Plant_Soil_PH.Plant_Soil_PH = 'Acid' 
OR Plant_Soil_PH.Plant_Soil_PH = 'Any' 
AND Plant_Foliage_Colour.Plant_Foliage_Colour = 'Green' 
AND Plant_Foliage_Colour.Plant_Season = 'Winter' 
OR Plant_Foliage_Colour.Plant_Season = 'Any' 
AND Plant_Flower_Colour.Plant_Flower_Colour = 'Orange' 
AND Plant_Flower_Colour.Plant_Season = 'Winter' 
OR Plant_Flower_Colour.Plant_Season = 'Any' 

GROUP BY Plant_ID; 

我期待查詢返回只有那些有記錄匹配的植物e搜索標準,即。只有那些可以在「冬季」或「任何」季節種植的植物,而是它不應該返回的植物。

例如:http://gyazo.com/d2ca989fc6def79854a1d9b11e4bc310 - Plant_ID: 1只包含Plant_Flower_Colour表中的一條記錄 - 春季的深藍色。爲什麼這個記錄已經被返回?就好像尾隨的ANDs和ORs被忽略。

任何幫助將不勝感激!

回答

3

IN和(或)將使用IN()子句的替代形式,它可以輕鬆讀取,輕鬆編輯並且不易發生事故。

WHERE Plant_Aspect.Plant_Aspect IN('East-facing' , 'Any') 
AND Plant_Soil_Type.Plant_Soil_Type IN('Sand' , 'Any') 
AND Plant_Moisture.Plant_Moisture IN('Well-drained' , 'Any') 
AND Plant_Soil_PH.Plant_Soil_PH IN('Acid' , 'Any') 
AND Plant_Foliage_Colour.Plant_Foliage_Colour IN('Green') 
AND Plant_Foliage_Colour.Plant_Season IN('Winter' , 'Any') 
AND Plant_Flower_Colour.Plant_Flower_Colour IN('Orange') 
AND Plant_Flower_Colour.Plant_Season IN('Winter' , 'Any') 
+0

+1:對於完全不同的方法和整齊地縮放的方法。 – 2013-02-14 01:50:04

+0

謝謝,我不知道IN子句! – 2013-02-14 02:01:05

3

我想您至少需要包括在你的或標準括弧:

... 
WHERE (Plant_Aspect.Plant_Aspect = 'East-facing' 
OR Plant_Aspect.Plant_Aspect = 'Any') 
AND (Plant_Soil_Type.Plant_Soil_Type = 'Sand' 
OR Plant_Soil_Type.Plant_Soil_Type = 'Any') 
... 
2

分組在WHERE子句是錯誤的 - 模棱兩可的普通讀者。並結合於或更嚴格,所以你需要使用括號,讓您的意圖明顯的DBMS:

WHERE (Plant_Aspect.Plant_Aspect = 'East-facing' 
    OR Plant_Aspect.Plant_Aspect = 'Any') 
    AND (Plant_Soil_Type.Plant_Soil_Type = 'Sand' 
    OR Plant_Soil_Type.Plant_Soil_Type = 'Any') 
    AND (Plant_Moisture.Plant_Moisture = 'Well-drained' 
    OR Plant_Moisture.Plant_Moisture = 'Any') 
    AND (Plant_Soil_PH.Plant_Soil_PH = 'Acid' 
    OR Plant_Soil_PH.Plant_Soil_PH = 'Any') 
    AND Plant_Foliage_Colour.Plant_Foliage_Colour = 'Green' 
    AND (Plant_Foliage_Colour.Plant_Season = 'Winter' 
    OR Plant_Foliage_Colour.Plant_Season = 'Any') 
    AND Plant_Flower_Colour.Plant_Flower_Colour = 'Orange' 
    AND (Plant_Flower_Colour.Plant_Season = 'Winter' 
    OR Plant_Flower_Colour.Plant_Season = 'Any') 

你所寫的被視爲如果你這樣寫:

WHERE Plant_Aspect.Plant_Aspect = 'East-facing' 
    OR (Plant_Aspect.Plant_Aspect = 'Any' 
    AND Plant_Soil_Type.Plant_Soil_Type = 'Sand') 
    OR (Plant_Soil_Type.Plant_Soil_Type = 'Any' 
    AND Plant_Moisture.Plant_Moisture = 'Well-drained') 
    OR (Plant_Moisture.Plant_Moisture = 'Any' 
    AND Plant_Soil_PH.Plant_Soil_PH = 'Acid') 
    OR (Plant_Soil_PH.Plant_Soil_PH = 'Any' 
    AND Plant_Foliage_Colour.Plant_Foliage_Colour = 'Green' 
    AND Plant_Foliage_Colour.Plant_Season = 'Winter') 
    OR (Plant_Foliage_Colour.Plant_Season = 'Any' 
    AND Plant_Flower_Colour.Plant_Flower_Colour = 'Orange' 
    AND Plant_Flower_Colour.Plant_Season = 'Winter') 
    OR Plant_Flower_Colour.Plant_Season = 'Any' 

+0

謝謝你的回答和時間。我實際上並不知道你需要在AND和OR子句中提供括號。每天學些新東西! – 2013-02-14 02:02:26

+0

當您編寫查詢時,您需要滿足兩個受衆:DBMS和其他程序員(例如6個月以內的您)。兩者都需要了解你寫的內容。數據庫管理系統瞭解你所寫的內容並執行你正確編寫的查詢。麻煩的是,你寫的和你想寫的不一樣。基本上,總是將要組合在一起的術語組合在一起,無論是使用括號還是使用替代技術(如IN子句)。 – 2013-02-14 02:29:10

2

嘗試在OR比較附近放置括號。

WHERE (Plant_Aspect.Plant_Aspect = 'East-facing' 
OR Plant_Aspect.Plant_Aspect = 'Any') 
AND (Plant_Soil_Type.Plant_Soil_Type = 'Sand' 
OR Plant_Soil_Type.Plant_Soil_Type = 'Any') 
AND (Plant_Moisture.Plant_Moisture = 'Well-drained' 
OR Plant_Moisture.Plant_Moisture = 'Any') 
AND (Plant_Soil_PH.Plant_Soil_PH = 'Acid' 
OR Plant_Soil_PH.Plant_Soil_PH = 'Any') 
AND Plant_Foliage_Colour.Plant_Foliage_Colour = 'Green' 
AND (Plant_Foliage_Colour.Plant_Season = 'Winter' 
OR Plant_Foliage_Colour.Plant_Season = 'Any') 
AND Plant_Flower_Colour.Plant_Flower_Colour = 'Orange' 
AND (Plant_Flower_Colour.Plant_Season = 'Winter' OR Plant_Flower_Colour.Plant_Season = 'Any') 
3

您需要使用圓括號將您的位置標準分組。

WHERE 
(Plant_Aspect.Plant_Aspect = 'East-facing' 
OR Plant_Aspect.Plant_Aspect = 'Any') 
AND (Plant_Soil_Type.Plant_Soil_Type = 'Sand' 
OR Plant_Soil_Type.Plant_Soil_Type = 'Any')...