Mysql 如何在查询结果中将表的条目设置为列?

Mysql 如何在查询结果中将表的条目设置为列?,mysql,Mysql,我想创建表'field_value'的条目,它包含表'field'的外键,因为许多列都是自定义列名的结果 让我举例说明: “字段值”表包含以下值: +---------------------+ | field_value | +---------------------+ |v_value v_id | | Peter 1 | | Lagaf 2 | | Football 3 | | Male

我想创建表'field_value'的条目,它包含表'field'的外键,因为许多列都是自定义列名的结果

让我举例说明: “字段值”表包含以下值:

+---------------------+
|     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更多彼得斯