2012-04-19 151 views
1

列鍵我有1臺與用戶在他們像這樣:附加價值進入另一個

id name email  status 
--------------------------------- 
1 Jane [email protected]  active 
2 Jack [email protected]  active 
3 Jane [email protected]  inactive 
4 Jack [email protected]  inactive 

我也有數據表像這樣:

id user_id key   value 
------------------------------ 
1 1  firts_name Jane 
2 1  last_name Do 
3 2  city  Amsterdam 
4 2  first_name Jack 

現在我想讓他們在一個查詢中像這樣:

id name email  status  firts_name last_name city 
------------------------------------------------------------------------- 
1 Jane [email protected]  active  Jane  Do   NULL 
2 Jack [email protected]  active  Jack  NULL  Amsterdam 
3 Jane [email protected]  inactive NULL  NULL  NULL 
4 Jack [email protected]  inactive NULL  NULL  NULL 

甚至可能在一個查詢中?

通常我會做2個查詢,然後結合2在PHP中,但我很好奇,如果這是可能的。

+0

你也通常在你的用戶表中重複的電子郵件/用戶名? – mellamokb 2012-04-19 22:08:25

+0

不,這只是一個例子!我也確保鑰匙不一樣。這是在代碼中完成的。我只是複製/粘貼這個例子! – 2012-04-19 22:10:37

+0

@MarcvdM:使用sql連接。 – SuperNoob 2012-04-20 01:00:10

回答

3

這可以通過連接表,並使用CASE語句很容易做到:

select 
    u.id, 
    u.name, 
    u.email, 
    u.status, 
    max(case when a.`key`='first_name' then a.value end) as first_name, 
    max(case when a.`key`='last_name' then a.value end) as last_name, 
    max(case when a.`key`='city' then a.value end) as city 
from 
    users u 
left join 
    attr a on a.user_id = u.id 
group by 
    u.id 

演示:http://www.sqlfiddle.com/#!2/66086/4

+0

如果attr.key是不可預知的!就像可以更多地添加allong一樣!它可以動態地嗎? – 2012-04-19 22:38:56

+0

如何編寫一個返回列的動態列表的查詢?關於可以完成的唯一方法是動態SQL,即即時生成SQL代碼並執行它。如果是這樣的話,最好的辦法就是用PHP生成動態查詢,或者完全按照PHP的方式完成數據操作。 – mellamokb 2012-04-19 22:43:34

0

雖然並不理想,相關子查詢會工作。如:

SELECT 
    `id`, 
    `name`, 
    `status`, 
    (SELECT `value` FROM `table2` WHERE `user_id`=`table1`.`id` AND `key`='first_name') AS first_name, 
    (SELECT `value` FROM `table2` WHERE `user_id`=`table1`.`id` AND `key`='last_name') AS last_name 
FROM `table1` 

但是,我有一種感覺,就像有更好的方法來做你正在尋找的東西。