我有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