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

今、私はそれらを1つのクエリでそのようにしたいです:

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

それは1つのクエリでも可能ですか?

通常、私は2つのクエリを実行してから、2つをphpで結合しますが、これが可能かどうか知りたいです。

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 に答える