MySQL使用字段定义定义视图中的列

MySQL使用字段定义定义视图中的列,mysql,database,join,Mysql,Database,Join,我有两个表——一个叫做“orders”,有3列:“id”、“name”和“created_by”,第二个叫做“fields”。字段表包含仅适用于某些订单类型的自定义字段。它有4列:“id”、“名称”、“值”和“订单id”。字段表还包含“orders\u id”与orders中id列的外键关系 为了说明这种架构的原因,在一种场景中,订单可能是针对物理产品的,因此需要“价格”、“成本”和“利润”字段。在第二种情况下,订单可能是针对每小时费率的服务,因此它需要“价格”、“每小时费率”、“利润”和“估计

我有两个表——一个叫做“orders”,有3列:“id”、“name”和“created_by”,第二个叫做“fields”。字段表包含仅适用于某些订单类型的自定义字段。它有4列:“id”、“名称”、“值”和“订单id”。字段表还包含“orders\u id”与orders中id列的外键关系

为了说明这种架构的原因,在一种场景中,订单可能是针对物理产品的,因此需要“价格”、“成本”和“利润”字段。在第二种情况下,订单可能是针对每小时费率的服务,因此它需要“价格”、“每小时费率”、“利润”和“估计小时数”字段

接下来,我创建了一个视图来连接两个表,如下所示:

            CREATE 
                ALGORITHM = MERGE 
                DEFINER = `root`@`localhost` 
                SQL SECURITY DEFINER
            VIEW `test_view` AS
                SELECT 
                    `orders`.`id` AS `id`,
                    `orders`.`name` AS `name`,
                    `orders`.`created_by` AS `created_by`,
                    `fields`.`name` AS `field_name`,
                    `fields`.`value` AS `field_value`,
                    `fields`.`order_id` AS `order_id`
                FROM
                    (`orders`
                    LEFT JOIN `fields` ON ((`fields`.`order_id` = `orders`.`id`)))
结果:

但是,这不是理想的格式。我更愿意在视图中使用字段名作为列,但除了使用外部代码以下面的方式手动组合表之外,我不太确定如何做到这一点

这是我想看到的:

有没有办法做到这一点


提前感谢:)

可以在select语句中合并子查询,这样您就可以得到类似的结果。多次访问数据库可能会影响性能

select
    id,
    name,
    created_by,
    (select field_value from test_view where id = id and field_name = "price") as price,
    (select field_value from test_view where id = id and field_name = "cost") as cost,
    (select field_value from test_view where id = id and field_name = "profit") as profit,
    (select field_value from test_view where id = id and field_name = "hourly rate") as "hourly rate",
    (select field_value from test_view where id = id and field_name = "estimated_hours") as estimated_hours
from test_view

这是一个简单的解决方案…不使用子查询并使其变得复杂

select id, name , created_by , 
   GROUP_CONCAT(if(field_name = 'price',field_value, NULL)) AS price,
   GROUP_CONCAT(if(field_name = 'cost',field_value, NULL)) AS cost,
   GROUP_CONCAT(if(field_name = 'profit',field_value, NULL)) AS profit, 
   GROUP_CONCAT(if(field_name = 'hourlyrate',field_value, NULL)) AS hourlyrate, 
   GROUP_CONCAT(if(field_name = 'estimated_hours', field_value, NULL)) AS estimated_hours
   FROM test_order GROUP BY id;

你正在寻找一个枢轴类型的解决方案,看看这个:嗯,现在为什么我没有想到呢?我可以先查询字段名,然后循环查询结果,以类似于上面的方式定义视图。谢谢顺便说一句,鉴于该应用程序只面向少数观众,因此性能的影响可以忽略不计。请也参考此链接