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

詹姆士

我在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是答案,但是我不知道如何将行值与列标题结合起来。

如果有人能向我指出正确的方向,我将不胜感激,如果您想出一种可以动态选择不同选项的解决方案,则可以加倍加分,这样以后我就可以在不重写查询的情况下添加更多内容。

提前谢谢了。

我希望将所有选项都包含在一行中的原因是,我希望使用Access来创建用于选择选项的表单,但我无法弄清楚单个表单如何创建多行。

戈登·利诺夫(Gordon Linoff)

这是一个可怕的数据布局。您应该有一个关联表,每个客户和一个选项一行。

但是,您可以这样做:

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)
);

实际上,您实际上应该为所有表都使用整数主键,并将其用于外键引用。如果您在问题的输出中需要数据,则只需编写一个查询以该格式返回它即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将行名和列名匹配到另一个数据框中的值

将表中的两个ID匹配到另一个表PgSQL

将一个表中的一组字符匹配到另一个表的记录中

将一个文件中的值匹配到另一个文件中

SQL查询:将列中的数据用作另一个表中的列名?

SQL根据另一个表将值分配到表中

将数据框中的缺失值匹配到另一个值

如何将数据框中的值匹配到另一个

将另一个表中的所有匹配值放入单个列的查询

如何使用grep / awk / unix将一个文件中的所有行匹配到另一个文件中,即使它们是重复的

Python:将一个列表中的值匹配到另一个列表中的值序列

如何将一个列表中的索引匹配到另一个列表并存储值?

如何将一个列表中的列匹配到另一个列表?

在MySQL中删除与另一个表中的两列匹配的行

将 1 个表行中的多个 ID 查询到 1 个查询中的另一个表

MySQL查询不在另一个表中

Google Sheet App Script:将一个工作表中的两个值匹配到另一个工作表,然后在它们匹配时设置一个值

将记录从一个表随机分配到另一个表

awk将模式从一个文件匹配到另一个文件

将单词从一个数据帧匹配到另一个

通过将列名与数据框中的变量匹配,将值从一个数据框中分配到另一个数据框中

如何从一个表中删除与另一个表匹配的行?

MySQL:从另一个表中具有匹配键的行更新表中的行

将值匹配到R中另一个数组中的最接近值

将值匹配到R中另一个列表中最接近的较大值

使用regExp将字符串中的多个单词动态匹配到另一个单词

MySQL:将另一个表中的2行合并为一个结果行

将数据框中的两列匹配到另一个数据框中的多个列,并返回第一个匹配列

SQL查询从另一个表中获取列名