2011-11-22 49 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
相关问题