Mysql 如何在查询结果中将表的条目设置为列?
我想创建表'field_value'的条目,它包含表'field'的外键,因为许多列都是自定义列名的结果 让我举例说明: “字段值”表包含以下值:Mysql 如何在查询结果中将表的条目设置为列?,mysql,Mysql,我想创建表'field_value'的条目,它包含表'field'的外键,因为许多列都是自定义列名的结果 让我举例说明: “字段值”表包含以下值: +---------------------+ | field_value | +---------------------+ |v_value v_id | | Peter 1 | | Lagaf 2 | | Football 3 | | Male
+---------------------+
| field_value |
+---------------------+
|v_value v_id |
| Peter 1 |
| Lagaf 2 |
| Football 3 |
| Male 4 |
| 12345678 5 |
+---------------------+
表字段将包含命名列
+--------------------+
| field |
+--------------------+
| f_id f_label |
| 1 surname |
| 2 name |
| 3 hobbies |
| 4 sex |
| 5 phone |
+--------------------+
结果如下:
+---------------------------------------------+
| Result |
+---------------------------------------------+
| surname name hobbies sex phone |
| Peter Lagaf Football Male 12345678 |
+---------------------------------------------+
您的数据库没有规范化——如果不知道规范化的模式应该是什么样子,就不可能给出明确的答案。此外,您的架构对于保存多个记录无效。您的问题中最重要的问题是,没有任何内容可以将构成记录的字段值集组合在一起,您没有说明每个记录的唯一标识符是什么,也没有说明每个“记录”在字段值表中是否具有完整的属性集 考虑一下数据库中有不止一条记录的情况——我们如何知道电话号码12345678与名字Peter相关,而不是Paul 最简单的解决方案(从静态数据的角度)是将记录标识符的属性添加到字段表中,然后:
SELECT record.value, surname.value, name.value, hobbies.value....
FROM field AS record
INNER JOIN field AS surname
ON record.record_id=surname.record_id
AND surname.f_id=1
INNER JOIN field AS name
ON record.record_id=name.record_id
AND name.f_id=2
INNER JOIN field AS hobbies
ON record.record_id=hobbies.record_id
AND hobbies.f_id=3
...
WHERE record.f_id=0
ON record.record_id=name.record_id
感谢symcbean的回复 我想简化这篇文章,这是真实的表格和真实的结果: 我想显示collect_id=2的订单项目 我想显示与每个订单项目相关的所有字段
+-------------------------------+
| order_item |
+-------------------------------+
| oi_id oi_price oi_collect_id |
| 1 100 2 |
| 2 30 2 |
| 3 55 3 |
| 4 70 4 |
| 5 220 2 |
| 6 300 4 |
+-------------------------------+
+-----------------------------------+
| field_value |
+-----------------------------------+
| v_value v_fk_field_id oi_fk_id |
| Peter 1 1 |
| Lagaf 2 1 |
| Football 3 1 |
| Male 4 1 |
| 12345678 5 1 |
| Frank 1 2 |
| Loran 2 2 |
| Tennis 3 2 |
| Male 4 2 |
| 11223658 5 2 |
| Nathali 1 3 |
| Waton 2 3 |
| Reading 3 3 |
+-----------------------------------+
oi_fk_id : foreign key ref(order_item.oi_id)
v_fk_field_id : foreign key ref(field.f_id)
+--------------------+
| field |
+--------------------+
| f_id f_label |
| 1 surname |
| 2 name |
| 3 hobbies |
| 4 sex |
| 5 phone |
+--------------------+
+-----------------------------------------------------------------------------+
| Result |
+-----------------------------------------------------------------------------+
| oi_id oi_price oi_collect_id surname name hobbies sex phone |
| 1 100 2 Peter Lagaf Football Male 12345678 |
| 2 30 2 Frank Loran Tennis Male 11223658 |
| 5 220 2 Nathali Waton Reading null null |
+-----------------------------------------------------------------------------+
重要提示:表格字段不仅包含这5个字段(姓名、姓氏、爱好、性别、电话),还可以包含许多开发人员可能不知道的其他字段,表格“field_value”上对应的值也是如此。我们如何知道足球是Peter的爱好,而不是其他人的?这种类型的设计称为EAV(实体属性值)考虑到您提供的示例数据是一个错误的选择,
f_label
值应该是列而不是行。唯一有意义的方法是,如果每个f_id只有1个值,如果是这种情况,那么以您的方式存储数据是没有意义的。此外,我怀疑世界上的Peter Lagafs比Laga更多彼得斯