2011-03-30 42 views
0

我有表product濾波記錄:米表標準

ID int 
name nvarchar() 

dummy data: (1,'car'), (2,'bike') 

我有表parameters

ID int 
name nvarchar() 

dummy data: (1,'abs'), (2,'audio'), (3,'eps'), (4,'air conditioning') 

最後我有n:m的表product_parameters持有有關產品參數信息。

ID int 
id_product int 
id_parameter int 

dummy data: 

(id,product,parameter) 
(1, 1, 1), 
(2, 1, 2), 
(3, 1, 3), 
(4, 2, 1) 

如何創建選擇其中:

  1. 顯示一切參數沒有在搜索定義
  2. 顯示汽車和自行車,因爲它們都具有參數腹肌
  3. 只顯示了汽車,因爲它搜索abs,eps,奧迪

這可能嗎?

UPDATE

我只創造了3個參數,但認爲它像無限數量的,無論是10,20或30個或更多...基本上是有辦法如何在這樣一種方式,它建立選擇將根據需要查詢一個參數或根據需要查詢20個參數。

回答

0

第一:

SELECT * FROM product PR 
JOIN product_parameters PP ON PR.ID=PP.id_product 
JOIN parameters PA ON PP.id_parameter=PA.ID 

二:

SELECT PR.* FROM product PR 
JOIN product_parameters PP ON PR.ID=PP.id_product 
JOIN parameters PA ON PP.id_parameter=PA.ID 
WHERE PA.name = 'abs' 

三:

SELECT PR.* FROM product PR 
WHERE EXISTS (SELECT * FROM product_parameters PP JOIN parameters PA ON PP.id_parameter=PA.ID WHERE PP.id_product=PR.ID AND PA.name='abs') 
AND EXISTS (SELECT * FROM product_parameters PP JOIN parameters PA ON PP.id_parameter=PA.ID WHERE PP.id_product=PR.ID AND PA.name='eps') 
AND EXISTS (SELECT * FROM product_parameters PP JOIN parameters PA ON PP.id_parameter=PA.ID WHERE PP.id_product=PR.ID AND PA.name='audi') 
+0

如果我有30個參數?我需要重複哪裏存在30倍? – feronovak 2011-03-30 15:13:23

+0

是的,我認爲是這樣..因爲你要求該行必須附加到所有參數。如果你說「任何」參數,它會小得多。如果你有這麼多參數,我建議將product_parameters連接從子查詢中移出,然後在主查詢中完成。你可以讓程序以編程方式生成EXISTS語句的長列表。 – roberttdev 2011-03-30 15:20:56