m:n关系

时间:2015-07-18 16:20:08

标签: mysql

我无法为这个问题找到一个干净的解决方案。

如果我们有一些产品:

id          name        price       store
----------------------------------------------
1           product1    10.30       inmyzone.com
2           product2    47          googol.su
3           product3    .99         Nederlandse Winkel
4           product4    321,09      Nederlandse Winkel

还有一些属性:

id          name
----------------------------------------------
1           brand
2           color

这些值与此相关:

product_id  property_id value
----------------------------------------------
1           1           Great Stuff
2           1           Best Brand Name Ever
3           1           Great Stuff
4           1           So bad, it's good
1           2           Red
2           2           Blue
3           2           Blue

我如何找到所有价格,品牌,商店和颜色

  • `store` ='Nederlandse Winkel'

  • `color` ='blue'和`store` ='Nederlandse Winkel'

  • `price`> = 10 AND`price`< = 10

到目前为止我一直在做什么。

如果我想要所有颜色和商店,如果`brand` ='Great Stuff'。

1将表连接到完整的产品表和WHERE(实际上是HAVING,因为它在编程上更容易)我排除了所有不必要的数据。

id          name        price       store               brand                 color
--------------------------------------------------------------------------------------------
1           product1    10.30       inmyzone.com        Great Stuff           red
3           product3    .99         Nederlandse Winkel  Great Stuff           blue

2我执行此查询:

SELECT "color" AS filter_name, 'color' AS filter_value 
FROM ({product table of step 1}) AS products 
GROUP BY filter_value
UNION ALL
SELECT "store" AS filter_name, 'store' AS filter_value 
FROM ({product table of step 1}) AS products 
GROUP BY filter_value

这种方法的问题在于我必须为每个过滤器重新创建步骤1的产品表。还有其他选择吗?

谢谢

更新:这就是结果

color     blue
color     red
store     inmyzone.com
store     Nederlandse Winkel

只要它包含所有可能的选项,它输出的方式并不重要。

1 个答案:

答案 0 :(得分:0)

一种方法是使用聚合和having子句:

select pv.product_id
from (<your step1 query here>) pv
group by pv.product_id

然后添加having条款,例如:

having sum(store = 'Nederlandse Winkel') > 0
having sum(store = 'Nederlandse Winkel') > 0 and sum(color = 'blue') > 0

我不了解第三个条件。