1

我在 mysql 中有一个表,我们称之为它foo,它的列数量有限。

| id | name |    date    |
--------------------------
| 1  | bar  | 2012-05-08 |
| 2  | buba | 2012-05-09 |

我的用户可以向表中添加记录(诸如、、、...之类的foo_field东西)。codedescriptiontime

| id | name        |
--------------------
| 1  | code        |
| 2  | description |
| 3  | time        |

在表foo_field_value中存储了用户定义字段的值,如下所示:

| id | foo_id | foo_field_id | value     |
------------------------------------------
| 1  | 1      | 1            | b         |
| 2  | 1      | 2            | Lalalala  |
| 3  | 1      | 3            | 12:00     |
| 1  | 2      | 1            | c         |
| 2  | 2      | 2            | We are go |
| 3  | 2      | 3            | 14:00     |

理想情况下,我想要一个查询,它会给我一个类似的结果

| id | name | date       | code | description | time  |
------------------------------------------------------
| 1  | bar  | 2012-05-08 | b    | Lalalala    | 12:00 |
| 2  | buba | 2012-05-09 | c    | We are go   | 14:00 |

如果不对每个 foo_field 的 foo_fields_value 表进行内部连接,这是否可能(通过先执行另一个查询来使用 PHP 生成查询)。

4

2 回答 2

2

只需一个即可完成,而且非常简单。

我们将稍微修改一下 foo_field 表,添加一个对应于 foo 表的 id 列的列,我假设它是主键。

所以现在我们有了

* foo
|------|
| id   |
| name |
| date |
|------|

* foo_field
|-------------|
| foo_id      |
| code        |
| description |
| time        |
|-------------|

这意味着我们可以通过一个简单的查询添加额外的字段:

SELECT * FROM foo
LEFT JOIN foo_field ON foo.id = foo_field.foo_id

这会给我们一个结果集

| id | name  |       date | foo_id | code   | description |     time |
|----+-------+------------+--------+--------+-------------+----------|
|  1 | asdw  | 2012-05-16 |      1 | asdasd | asdasd      | 15:03:41 |
|  2 | fdgfe | 2012-05-18 |      2 | asdas  | asdas       | 15:03:41 |
|  3 | asdw  | 2012-05-16 |      3 | asdas  | asdas       | 15:03:52 |
|  4 | fdgfe | 2012-05-18 |      4 | asdasd | asdasd      | 15:03:52 |

我仍然不确定我是否确实理解了你的问题。如果您想创建真正动态的值和数据结构,我建议您将序列化数组保存到数据库中的TEXT字段中,但如果是这种情况,我也建议您忽略您的解决方案;如果您希望您的解决方案能够增长,您希望管理尽可能严格的结构。

于 2012-05-08T13:12:52.517 回答
0

您正在寻找的是一个数据透视查询。而且由于您有需要转换为列的动态字段,请在此处查看有关进行自动数据透视查询的这篇文章

http://www.artfulsoftware.com/infotree/queries.php#523

于 2012-05-08T13:11:18.557 回答