プロが教える店舗&オフィスのセキュリティ対策術

行と列の入れ替え検索(行は可変で項目を固定にしたい)のSQL文が出来ない

以下のテーブルがあります。

<テーブルA>
UID  name
---------------
1   伊藤
2   鈴木
3   高橋
4   佐藤

<テーブルB>
no UID key   value
-------------------
1  1  telno  001-01-0001
2  1  faxno  001-01-0002
3  1  nickname itochan
4  2  telno  111-11-1111
5  2  faxno  111-11-1112
6  3  nickname hashi

この2つのテーブルがあります。
・テーブルAにあるUIDはテーブルBにない場合もあります。
この場合、以下のように出力して、csvファイルにしたいのですが、可能でしょうか?

申し訳ありませんが、よろしくアドバイスお願いいたします。

UID  name  telno    faxno     nickname
-------------------------------------------------
1   伊藤  001-01-0001 001-01-0002  itochan
2   鈴木  111-11-1111 111-11-1112
3   高橋                  hashi
4   佐藤

(経緯:wordpressのユーザの一覧(users,usetmetaテーブル)をユーザ一覧としてCSV形式にして保管したいのです。抽出&登録できるプラグインがなかったので)

A 回答 (4件)

抜けがあった



SELECT
`a`.`UID`,
`a`.`name`,
MAX(CASE `b`.`key` WHEN 'telno' THEN `b`.`value` ELSE '' END) AS 'telno',
MAX(CASE `b`.`key` WHEN 'faxno' THEN `b`.`value` ELSE '' END) AS 'faxno',
MAX(CASE `b`.`key` WHEN 'nickname' THEN `b`.`value` ELSE '' END) AS 'nickname'
FROM `tableA` AS `a` LEFT JOIN `tableB` AS `b`
ON `a`.`UID`=`b`.`UID`
GROUP BY `UID`
    • good
    • 0
この回答へのお礼

お礼遅くなりました。こんな方法もあったんですね。恥ずかしながら始めて知りました。
ありがとうございます。

お礼日時:2010/11/13 12:44

SELECT


`a`.`UID`,
`a`.`name`,
GROUP_CONCAT(CASE `b`.`key` WHEN 'telno' THEN `b`.`value` END) AS 'telno',
GROUP_CONCAT(CASE `b`.`key` WHEN 'faxno' THEN `b`.`value` END) AS 'faxno',
GROUP_CONCAT(CASE `b`.`key` WHEN 'nickname' THEN `b`.`value` END) AS 'nickname'
FROM `tableA` AS `a` JOIN `tableB` AS `b`
ON `a`.`UID`=`b`.`UID`
GROUP BY `UID`
    • good
    • 0

構造が微妙ですが、とりあえず列数分joinしてやれば?



select a.UID,a.name,b1.value as telno,b2.value as falxno,b3.value as nickname
FROM tableA as a
LEFT JOIN tableB as b1
on a.UID=b1.UID and b1.`key`='telno'
LEFT JOIN tableB as b2
on a.UID=b2.UID and b2.`key`='faxno'
LEFT JOIN tableB as b3
on a.UID=b3.UID and b3.`key`='nickname'
    • good
    • 0
この回答へのお礼

ありがとうございました。実現することが出来ました。

お礼日時:2010/10/30 17:13

select


distinct a.uid UID
,a.name name
,(select value from table_B b2 where b2.uid=b.uid and `key`='telno') telno
,(select value from table_B b2 where b2.uid=b.uid and `key`='faxno') faxno
,(select value from table_B b2 where b2.uid=b.uid and `key`='nickname') nickname
from table_A a
left join table_B b
on a.uid=b.uid
;
    • good
    • 0
この回答へのお礼

ありがとうございました。実現することが出来ました。

お礼日時:2010/10/30 17:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す