MYSQL查询将列名匹配到另一个表中的行

时间:2014-01-17 02:40:08

标签: mysql join pivot union

我在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来创建一个表单来选择选项,我无法弄清楚单个表单如何创建多行。

3 个答案:

答案 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

通过这样,您可以连接表并选择客户购物篮大小和客户对配件的偏好。可以汇总购物篮尺寸或每位客户购买的金额SUMAVGCOUNT,也可以使用GROUP_CONCAT来转化数据,以生成高质量的报告。< / p>