2012-09-05 61 views
0

我有一个系统,我有动态的用户信息。基本上,我有一个用户名,用户名,电子邮件和密码(所需的基础知识)。如果系统管理员想要添加一个用户字段,他们可以通过在user_fields表中添加一个新条目来实现,那么该字段的数据将存储在user_fields_data中。MySQL联盟/加入行与列

用户:

id | name  | email   | password 
============================================= 
1 | bob smith | [email protected] | asdfasdfasdf 
... 

user_fields:

id | field 
========== 
1 | address_1 
2 | address_2 
... 

user_fields_data:

user_id | field_id | value 
=============================== 
1  | 1  | 123 abc st 
1  | 2  | suite 314 

基本上我的目标是要执行一个查询在那里我可以得到所有的信息。

array(
    'name'  => 'bob', 
    'email'  => '[email protected]', 
    'password' => 'asdfasdfasdf', 
    'address_1' => '123 abc st', 
    'address_2' => 'suite 314' 
) 

我整天都在一起连接表,但是我从来没有必要以这种方式连接(行/列)。

在此先感谢!

+0

目前?没有^^。我知道如何使用两个独立的SQL语句来执行此操作,但是甚至不知道如何从这种类型的连接开始。 –

+0

这是一个普通的旧连接...只需写入sql。问题是你会得到很多行 - 这将需要在表示层展开。为这种可怜的模式设计嘘声。 – Randy

+0

@Randy正确,我不打算在每一行中获取用户中的所有数据。你将如何去改变架构? –

回答

3
select 'name' as name, name as value from user where id = 1 
union all 
select 'email', email from user where id = 1 
union all 
select 'password', password from user where id = 1 
union all 
select uf.field, ufd.value 
from user_fields_data ufd 
inner join user_fields uf on ufd.field_id = uf.id 
where ufd.user_id = 1 

SQL Fiddle Example

输出什么样的自定义字段:

|  NAME |   VALUE | 
----------------------------- 
|  name |  bob smith | 
|  email | [email protected] | 
| password | asdfasdfasdf | 
| address_1 | 123 abc st | 
| address_2 |  suite 314 | 
+0

这似乎是个窍门。然而,我想我正在寻找一个更简单的答案,因为我的用户表有大约7或8个字段(这将使这种类型的查询有点令人生畏,哈哈)。非常感谢! –

+1

@MichaelLynch好吧,这在应用程序层更容易完成,所以选择你的毒药。 – RedFilter

+0

是的,因为这正是我所期待的。我只是继续前进,并在两个单独的查询中做到这一点,在第一次我得到users表中的所有(*)字段,以防将来我必须放置更多字段。即使我必须稍后返回并添加更多,也可以使该查询生效。感谢您的回复,并感谢您向我展示了SQL-Fiddle(我用过其他人,只是从来不知道有一个用于SQL)。 –