我有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)「
解決這個問題的方法是什麼?
謝謝。
我有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)「
解決這個問題的方法是什麼?
謝謝。
我可能會越來越棒錯誤的結束,但你不只是需要像
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
)
解決這種方法,這也取決於你想在你的選擇返回哪些列。如果你想要的只是產品的欄目,那麼它很簡單。
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而言,這仍然是一對多的關係。
你說:
(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
是的,沒關係。但我需要得到唯一的product_id,其中第一個和第二個參數是2000和1000. – 2012-02-09 06:51:16
請提供您當前的SELECT語句並使用它更新問題,以便我們可以理解您要尋找的內容 – 2012-02-09 06:53:29
如果您的表格是爲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)列,因爲它們可能必須是唯一的。
關於唯一性的好消息約束,即使有人堅持使用合成主鍵,該約束也應該存在。 – araqnid 2012-02-09 12:02:42
究竟是什麼問題......你沒有提到它:) – 2012-02-09 02:50:58
那麼,我需要得到獨特的產品ID與參數 – 2012-02-09 06:40:02