我在MYSQL中有两个表,一个包含客户可以选择的选项列表,另一个包含选项的成本。我想要一个返回每个客户选项集的成本的视图。在我的例子中,我将使用购买新车的类比。
客户表
customer - sunroof - mag_wheels - spoiler
--------------------------------------------------
John - true - true - false
Steve - false - true - false
Lucy - false - false - false
选项表
option - price
-----------------
sunroof - 100
mag_wheels - 150
spoiler - 75
期望的结果
customer - cost
-----------------
John - 250
Steve - 150
Lucy - 0
或者这样做,因为我很容易通过价格选择,然后按客户分组
customer - option - selected - price
------------------------------------------
John - sunroof - true - 100
John - mag_wheels - true - 150
John - spoiler - false - 75
Steve - sunroof - false - 100
Steve - mag_wheels - true - 150
Steve - spoiler - false - 75
Lucy - sunroof - false - 100
Lucy - mag_wheels - false - 150
Lucy - spoiler - false - 75
我一直困扰着这几个小时,我甚至无法弄清楚从哪里开始,因为没有共同的元素可以匹配,所以加入似乎是不可能的。我想知道是否使用UNION是答案,但我无法弄清楚如何将行值与列标题组合。
如果有人能指出我正确的方向我会非常感激,如果你想出一个能够动态选择不同选项的解决方案,那么我将来可以添加更多,而不需要重写查询。 / p>
非常感谢提前。
我希望将所有选项作为单行的原因是我希望使用Access来创建一个表单来选择选项,我无法弄清楚单个表单如何创建多行。
答案 0 :(得分:1)
这是一个糟糕的数据布局。您应该有一个关联表,每个客户和选项一行。
但是,你可以这样做:
select c.customer, sum(o.cost) as cost
from customers c left outer join
options o
on (c.sunroof = true and o.option = 'sunroof' or
c.mag_wheels = true and o.option = 'mag_wheels' or
c.spoiler = true and o.option = 'spoiler'
)
group by c.customer;
编辑:
你不想要单个记录中的所有选项。相反,您需要一个关联表:
create table customer_options (
customer_optionid unsigned auto_increment,
customer varchar(255) references customer(name),
option varchar(255) references option(option)
);
实际上你应该为所有表都有整数主键,并将它们用于外键引用。如果您在问题的输出中需要数据,那么只需编写一个查询以便以该格式返回它。
答案 1 :(得分:0)
查看表结构,即使我认为也不可能编写联接,因为正如您所提到的,表结构之间没有关系。
我假设你刚刚开始这个项目,所以你第一次重新访问你的数据库结构并更正它。
理想情况下,您应该拥有一个具有客户ID的客户表。 那么你应该有产品ID的产品表。 一个表格将包含客户购买的产品数据 - 类似于customer_products。这将是一对多的关系。因此,客户1可以拥有产品1,3和5.这意味着在customer_product中将有三个条目。
然后,当您想要总计时,您可以先加入表客户,基于customer_product的产品,然后再计算价格总和以获得个别客户的总金额。
答案 2 :(得分:0)
糟糕的设计。您必须拥有这样的客户表:
custumer_id
customer_name
other fileds...
另一方面,您应该有一个配件表,您通常会在其中描述每个项目 -
accesory_id
accesory_name
supplier_id
country_of_origin
other stuff
还是一个accesory_price表,由于价格变化而增加了价格。
accesory_id
price
active_price
date_price_added
最后,您应该在customer_accesory表中关联所有内容:
customer_id
accesory_id
通过这样,您可以连接表并选择客户购物篮大小和客户对配件的偏好。可以汇总购物篮尺寸或每位客户购买的金额SUM
,AVG
,COUNT
,也可以使用GROUP_CONCAT
来转化数据,以生成高质量的报告。< / p>