2012-02-09 76 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