我在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)”
解决这个问题的方法是什么?
感谢。
答案 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)列,因为它们可能必然是唯一的。