2010-11-19 75 views
0

我需要用下面的sheme数据库:使用什么数据库模型?

Product | Discounter | Price 
--------------------------------------------------------- 
Onion | a | 99.99 
    | b | 1.07 
    | c | 750.00 
Garlic | a | 0.39 
    | b | 17.56 
    | c | 3.59 

我想使用MySQL,但我怎么能展开“产品”在细胞中的“折扣”的每一行?

由于提前, 未知

+0

我不明白格式化的问题 - 你想用这张表格表示什么? – Carl 2010-11-19 13:33:15

+0

我想在多个折扣店中显示单个产品的价格 – 2010-11-19 13:35:40

回答

3

使用两个表。您的表可能看起来像下面的(伪DDL)

Product 
    product_id int, 
    product_name varchar(20), 
    constraint pk_product primary key (product_id) 

ProductDiscounter 
    product_id int, 
    discounter char(1), 
    price decimal, 
    constraint pk_product_discounter primary key (product_id, discounter), 
    constraint fk_product_discounter foreign key (product_id) references (Product.product_id) 

要选择不同的价格带,说一个产品,ID 1您可以执行以下select语句:

select p.product_name, pd.discounter, pd.price 
from Product p, ProductDiscounter pd 
where p.product_id = pd.product_id 
and p.product_id = 1 
+0

同意克劳斯。 您应该添加主键Product(product_id)和ProductDiscounter(product_id,discounter) 请参阅http://en.wikipedia.org/wiki/Third_normal_form – kolchanov 2010-11-19 13:40:59

+0

@kolchanov,您是对的。我已经更新了答案。 – 2010-11-19 13:45:40

+0

Mange tak,克劳斯! – 2010-11-19 16:36:18

0

你不能在一列中有一个单元格跨越多行。

克劳斯的答案非常一般(并且支持将各种其他数据从产品ID中挂起),所以如果您对问题有任何真正的复杂性,我会采用这种方式。但是,如果案例与问题中所述的一样简单,则可以将产品名称放在每一行中。一个SELECT * WHERE Product ==什么都可以在那种桌子上工作得很好。

0

在克劳斯指定的方式对表格进行结构化/标准化后,我还建议将它作为非常有用的组函数。有什么好的关于这个是你可以实际上有数据分析计算每个产品的平均价格,折扣之间。我还会指出,您可以通过产品名称对最终结果(即使在分组后)进行排序,以便在显示时保持界面友好。

SELECT p.product_name, pd.discounter, Avg(pd.price) as `Average Discounter Price` 
FROM Product p 
LEFT JOIN ProductDiscounter pd ON p.product_id = pd.product_id 
GROUP BY p.product_id 
ORDER BY p.product_name 
+0

谢谢zanlok! – 2010-11-20 09:24:37