2016-10-19 26 views
1

我有一個規範化數據庫,其中上級表包含不同的產品和從屬表特徵。下級表通過外鍵鏈接到上級表。這意味着如果幾個特徵與產品的屬性相匹配,則在下屬表中可能有多次出現一個且相同的特徵_id(=外鍵),例如,如何避免從SQL數據庫中選擇,如果某些值匹配

Superior table (product_main_table): 

product_id  product_name    
23   apple 
24   orange 

25   strawberry  

Subordinate table (product_characteristics): 

characteristic_id product_name   characteristic 

23   apple    green   
23   apple    sweet 
23   apple    small 
23   apple    american  
24   orange    orange   
24   orange    sourly 
24   orange    big 

24   orange    african 

25   strawberry   red 

25   strawberry   sweet 

我有一個html格式來讀出數據,也應該有可能搜索所有不符合某些特徵的產品。 但是,這不起作用。當我輸入以下請求:

SELECT DISTINCT main.product_name 
FROM product_main_table main, product_characteristics prodchar 
WHERE prodchar.characteristic != 'sweet' 

結果是「蘋果」,「橙」和「草莓」,wheresas它應該是「橙色」,而已。其他兩種產品當然是選擇的,因爲它們有其他特性,而不是「甜」的選擇。

我會很樂意,如果解決方案將融入我一般SQL請求

$sql = "SELECT DISTINCT $selection FROM $tabelle WHERE $masterarray"; 

其中​​和$masterarray從HTML條目得到他們的內容。

如何使我的where語句,以便產品沒有被選中,如果它包含一個不應該存在的單一特徵?

+1

你需要一個條件。 add main.product_name = sub_ord.product_name :) – WannaBeCoder

+0

如果你的特性數據庫中有另一個字段用於分類(顏色,味道等),那麼你可以做WHERE prodchar.category ='taste'AND prodchar.characteristic!='sweet ' – Stevish

+1

謝謝你的回答! :)但是,結果與以前一樣。 – Columbus

回答

0

http://sqlfiddle.com/#!9/7fd63b/5

SELECT pmt.product_name 
FROM product_characteristics pc 
JOIN product_main_table pmt 
ON pmt.product_id = pc.characteristic_id 
GROUP BY characteristic_id 
HAVING SUM(characteristic IN ('sweet'))=0 
+0

謝謝亞歷克斯!您的解決方案帶來正確的結果! :)是否有可能將我的Select-query中的JOIN語句與Where語句集成在一起?因爲,並行地,應該可能有多個其他查詢。 – Columbus

+0

亞歷克斯,這個解決方案的問題剛剛發生:如果只有一個值不應該出現,它就完美了!然而,如果有更多的值被添加(例如HAVING SUM(特徵IN('sweet,big,red'))= 0),則列表變長並且存在值,不應該被選擇。 – Columbus

+0

如果您在'IN'數組中添加更多值,我看不到任何問題。請提供任何證據:行數據樣本和應排除的值列表。 – Alex

0
SET @characteristic='sweet,sour,bland'; 
... 
WHERE FIND_IN_SET(prodchar.characteristic, @characteristic) = 0 

或按您的要求的例子

$sql = "SET @characteristic='sweet,sour,bland';SELECT DISTINCT $selection FROM $tabelle WHERE FIND_IN_SET(prodchar.characteristic, @characteristic) = 0;"; 

你也可以使用PHP的字符串連接,如果需要在您的變量來呼應到$ SQL變量。

+0

謝謝!但'甜蜜'只是一個例子。這應該是可變的,以便一個或多個特徵可以排除 – Columbus

+0

編輯給這個鏡頭它應該得到你需要的東西 –

+0

只是確保你餵你的html字段獲得逗號分隔的SET變量 –

0

我想你可以使用NOT IN功能:

... WHERE prodchar.characteristic NOT IN (SELECT characteristic FROM product_characteristics WHERE name = main.product_name)

0

你可以做一些事情像

SELECT DISTINCT prodchar.product_name FROM product_characteristics prodchar WHERE prodchar.product_name not in (select product_name from product_characteristics where characteristic in ('sweet'))

http://sqlfiddle.com/#!9/ce6f6/7

性能會很糟糕,嘗試使用加入。 Join vs. sub-query

相關問題