MySQL使用字段定义定义视图中的列
我有两个表——一个叫做“orders”,有3列:“id”、“name”和“created_by”,第二个叫做“fields”。字段表包含仅适用于某些订单类型的自定义字段。它有4列:“id”、“名称”、“值”和“订单id”。字段表还包含“orders\u id”与orders中id列的外键关系 为了说明这种架构的原因,在一种场景中,订单可能是针对物理产品的,因此需要“价格”、“成本”和“利润”字段。在第二种情况下,订单可能是针对每小时费率的服务,因此它需要“价格”、“每小时费率”、“利润”和“估计小时数”字段 接下来,我创建了一个视图来连接两个表,如下所示:MySQL使用字段定义定义视图中的列,mysql,database,join,Mysql,Database,Join,我有两个表——一个叫做“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;
你正在寻找一个枢轴类型的解决方案,看看这个:嗯,现在为什么我没有想到呢?我可以先查询字段名,然后循环查询结果,以类似于上面的方式定义视图。谢谢顺便说一句,鉴于该应用程序只面向少数观众,因此性能的影响可以忽略不计。请也参考此链接