将动态列添加到MySQL结果中

时间:2012-05-08 12:42:53

标签: php mysql

我在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_fields_value表上为每个foo_field执行内部联接(通过先执行另一个查询来使用PHP生成查询),这是否可行。

2 个答案:

答案 0 :(得分: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 |

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

答案 1 :(得分:0)

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

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