【问题标题】:MYSQL Query matching column names to rows in another tableMYSQL查询将列名与另一个表中的行匹配
【发布时间】:2014-01-17 02:40:08
【问题描述】:

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

【问题讨论】:

  • 您应该重新设计您的表格。从 users 表中删除选项 - 它们应该被拆分到自己的表中:users -> user_options -> options,之后您可以使用简单的 JOIN 操作来完成您想要的操作。
  • 我将有一个单独的用户表,我只是在选项表中有用户名,这样我就可以区分订单。如果我有一个单独的用户表,查询会是什么样子?

标签: mysql join pivot union


【解决方案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)
);

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

【讨论】:

  • 我很高兴更改布局,理想情况下,我希望一行包含客户的所有选项,因为我有一个带有一堆复选框的表单来设置选项,但我想不通了解如何让表单插入多行。
  • 我希望将所有选项作为一行的原因是我希望使用 Access 制作一个用于选择选项的表单,但我无法弄清楚单个表单如何创建多个行。我知道围绕前端的缺点设计架构是不好的......
  • @JamesG 。 . .将数据正确存储在关系数据库中。使用查询将数据拉入 Access 并在您的应用程序中进行最终格式化。
【解决方案2】:

查看表结构,即使我认为不可能编写连接,因为正如您所说,表结构之间没有关系。

我假设您刚刚开始该项目,因此您应该重新访问您的数据库结构并进行更正。

理想情况下,您应该有一个带有客户 ID 的客户表。 然后你应该有产品 id 的产品表。 一张表,其中包含有关客户购买了哪些产品的数据——比如 customer_products。这将是一对多的关系。因此客户 1 可以拥有产品 1,3 和 5。这意味着在 customer_product 中将有三个条目。

然后当你想做一个总和时,你可以先加入表 customer,基于 customer_product 的产品,然后对价格进行总和,以获得单个客户的总金额。

【讨论】:

    【解决方案3】:

    糟糕的设计。您必须有一个这样的客户表:

    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 透视数据以生成高质量的报告。

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2011-04-14
      • 2021-07-12
      • 2012-04-24
      相关资源
      最近更新 更多