2012-09-05 42 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)。 –