1

我有 1 个表,其中有用户,如下所示:

id  name    email       status
---------------------------------
1   Jane    j@ne.do     active
2   Jack    j@ck.do     active
3   Jane    j@ne.do     inactive
4   Jack    j@ck.do     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    j@ne.do     active      Jane        Do          NULL
2   Jack    j@ck.do     active      Jack        NULL        Amsterdam
3   Jane    j@ne.do     inactive    NULL        NULL        NULL
4   Jack    j@ck.do     inactive    NULL        NULL        NULL

这甚至可能在一个查询中吗?

Normaly 我做 2 个查询,然后在 php 中组合 2 个,但我很好奇这是否可能。

4

3 回答 3

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

于 2012-04-19T22:13:22.753 回答
0

您需要使用准备好的语句:

http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html

于 2012-04-19T22:06:15.883 回答
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`

但是,我觉得有一种更好的方法来做你正在寻找的事情。

于 2012-04-19T22:11:48.913 回答