2011-11-22 67 views
1

我正在使用postgresql。如何找到所有具有特定多屬性值的產品

我有一個名爲custom_field_answers的表。數據看起來像這樣

Id | product_id | value  | number_value | 
4 | 2   |   | 117   | 
3 | 1   |   | 107   | 
2 | 1   | bangle  |    | 
1 | 2   | necklace |    | 

我想找到所有已TEXT_VALUE爲「手鐲」和NUMBER_VALUE小於50

這是我第一次嘗試的產品。

SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
WHERE ("custom_field_answers"."value" ILIKE 'bangle') 

這裏是我的第二次嘗試。

SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
where ("custom_field_answers"."number_value" < 50) 

這是我的最後一次嘗試。

SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
WHERE ("custom_field_answers"."value" ILIKE 'bangle') 
AND ("custom_field_answers"."number_value" < 50) 

但是這不會選擇任何產品記錄。

回答

1

WHERE子句一次只能查看一行中的列。

所以如果你需要一個適用於兩個不同的行的條件,你需要連接到這個表兩次,所以你可以從兩行中獲取列。

SELECT p.* 
FROM "products" AS p 
INNER JOIN "custom_field_answers" AS a1 ON p."id" = a1."product_id" 
INNER JOIN "custom_field_answers" AS a2 ON p."id" = a1."product_id" 
WHERE a1."value" = 'bangle' AND a2."number_value" < 50 
+1

這就是我正在處理的查詢! – drdwilcox

0

這應該工作:

的選擇P * FROM產品LEFT JOIN custom_field_answersÇ ON(c.product_id = p.id和c.value LIKE '%手鐲%' AND c.number_value

希望它有幫助

+0

我不相信會工作。 'JOIN'中的每個結果行將**都有'value'字段或'number_value'字段,但不是兩者都有。您可以將自定義表格加入自己,然後查找匹配項。 – drdwilcox

1

它不會產生記錄,因爲沒有符合這兩個條件的custom_field_answers記錄您想要的是在表中具有必要記錄的product_id列表中,以防萬一無法編寫SQL你,直到我有機會自己解決這個問題,我想我至少會解釋一下你爲什麼你的查詢不起作用。

0

您的手鐲相關的number_value字段爲空,因此您無法在這些情況下進行直接比較。相反,首先將您的空值轉換爲0。

SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
WHERE ("custom_field_answers"."value" LIKE '%bangle%') 
AND (coalesce("custom_field_answers"."number_value", 0) < 50) 
0

沒有實際測試,但是,這個總體思路應該工作:

SELECT * 
FROM products 
WHERE 
    EXISTS (
     SELECT * 
     FROM custom_field_answers 
     WHERE 
      custom_field_answers.product_id = products.id 
      AND value = 'bangle' 
    ) 
    AND EXISTS (
     SELECT * 
     FROM custom_field_answers 
     WHERE 
      custom_field_answers.product_id = products.id 
      AND number_value < 5 
    ) 

用簡單的英語:獲取所有的產品,使得...

  • 存在相關行custom_field_answers其中value = 'bangle'
  • 並且在custom_field_answers中有(可能不同)相關行,其中number_value < 5
相關問題