2012-02-09 74 views
1

我有PostgreSQL的三個表:複雜的SQL查詢到許多

1. product: id, name 
2. param: id, name 
3. param_product: id, product_id, param_id, value - (!) it's Many to Many 

這是一個與選擇的產品有問題,例如,「(param_id = 1和值= 2000)和(param_id = 2和值= 1000)「

解決這個問題的方法是什麼?

謝謝。

+0

究竟是什麼問題......你沒有提到它:) – 2012-02-09 02:50:58

+0

那麼,我需要得到獨特的產品ID與參數 – 2012-02-09 06:40:02

回答

0

我可能會越來越棒錯誤的結束,但你不只是需要像

SELECT pr.* 
     FROM product pr 
INNER JOIN param_product pp ON pr.id = pp.product_id 
     AND pa.id = pp.param_id 
    WHERE 
      (
      pa.id = 1 
      AND pp.value = 2000 
      ) 
     OR 
      (
      pa.id = 2 
      AND pp.value = 1000 
      ) 
1

解決這種方法,這也取決於你想在你的選擇返回哪些列。如果你想要的只是產品的欄目,那麼它很簡單。

SELECT * 
FROM product 
WHERE  EXISTS (SELECT 1 FROM product_id = product.id AND param_id=1 and value=2000) 
     AND EXISTS (SELECT 1 FROM product_id = product.id AND param_id=2 and value=1000) 

此外,就SQL而言,這仍然是一對多的關係。

0

你說:

(param_id = 1和值= 2000)和(param_id = 2和值= 1000)

通知param_id不能在相同的是1和2時間:)試試這個:

(param_id=1 and value=2000) OR (param_id=2 and value=1000)

這將會給你帶來param_id 1,其中值等於2000和param_id 2,其中值等於1000

+0

是的,沒關係。但我需要得到唯一的product_id,其中第一個和第二個參數是2000和1000. – 2012-02-09 06:51:16

+0

請提供您當前的SELECT語句並使用它更新問題,以便我們可以理解您要尋找的內容 – 2012-02-09 06:53:29

0

如果您的表格是爲N:M關係設計的,當然您在選擇唯一值時會遇到問題。最簡單的方法是使用MIN()或MAX()函數

SELECT DISTINCT MAX(product.id) 
FROM product 
JOIN param_product ON param_product.product_id = product.id 
WHERE param_id IN ('1000', '2000') 

我認爲這應該可以幫助您順利完成任務。

此外,如果產品對於param是唯一的,您不需要「param_product」表中的「id」列,則可以指派主鍵ON(product_id,param_id)列,因爲它們可能必須是唯一的。

+0

關於唯一性的好消息約束,即使有人堅持使用合成主鍵,該約束也應該存在。 – araqnid 2012-02-09 12:02:42