我在mysql中有一个表,我们称之为foo
,并且它有一定数量的列。
| id | name | date |
--------------------------
| 1 | bar | 2012-05-08 |
| 2 | buba | 2012-05-09 |
我的用户可以向表格foo_field
添加记录(code
,description
,time
等内容。
| 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生成查询),这是否可行。
答案 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)
您正在寻找的是一个透视查询。由于您有需要转换为列的动态字段,请查看此处有关进行自动透视查询的文章