许多对复杂的SQL查询

时间:2012-02-09 00:13:22

标签: sql postgresql many-to-many

我在PostgreSQL中有三个表:

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和value = 2000)和(param_id = 2且值= 1000)”

解决这个问题的方法是什么?

感谢。

4 个答案:

答案 0 :(得分: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而言,这仍然是一对多的关系。

答案 1 :(得分: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
           )

答案 2 :(得分:0)

你说:

  

(param_id = 1且value = 2000)和(param_id = 2且value = 1000)

注意param_id不能同时为1和2 :)请尝试改为:

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

这将为你提供param_id 1,其中value等于2000,param_id 2,其中value等于1000。

答案 3 :(得分: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)列,因为它们可能必然是唯一的。