みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

JOINでの結果取得 サブクエリをJOINする

WordPressのデータベースでテーブル2つを結合して以下の情報を取得しようとしています

メール(wp_users.user_email)|名前(wp_usermeta.meta_value)|登録日時(wp_users.user_registered )
123@a.com,山田,2012-06-17 12:33:44
456@b.jp,田中,2012-06-21 07:26:54
789@c.ne.jp,\N,2009-08-11 12:19:00
1234@d.ne.jp,\N,2009-08-11 12:19:00
321@x.ne.jp,\N,2009-08-11 12:19:00

・ユーザーはwp_usersテーブルにeメール情報(user_email)を必ず持ている
・ユーザーの名前はwp_usermetaテーブルのwp_usermeta.meta_keyがuser_nameなレコードに保存されているが、ユーザーによってあるものとないものがある。無い場合はNULLにする。

テーブル構造は添付した画像に記載されています。

■ユーザ数
mysql> SELECT COUNT(*) FROM wp_users;
18290

まずwp_usersとwp_usermetaをLEFT JOINしてmeta_key = 'user_name'なレコードを取得しようとしましたが、user_nameを持っているユーザーのみしか取得できませんでした。
■user_nameを持っていないユーザーが取得できない
SELECT u.user_email, m.meta_value FROM wp_users AS u LEFT JOIN wp_usermeta AS m ON u.ID = m.user_id WHERE m.meta_key = 'user_name'\G
2075 rows in set (0.00 sec)

次にサブクエリをJOINしました。結果は正しいものを取得できたのですが、実行時間が40秒以上かかってしまい実用性がありません。
■欲しい結果(速度が遅い)
SELECT u.user_email, a.meta_key, a.meta_value, u.user_registered FROM wp_users AS u LEFT JOIN (select * from wp_usermeta where meta_key = 'user_name') as a ON u.ID = a.user_id;
18290 rows in set (45.45 sec)

この結果を取得できる、正しいSQLを教えてください。よろしくお願いします。

投稿日時 - 2012-06-22 15:46:14

QNo.7548352

困ってます

質問者が選んだベストアンサー

いまいち構造がわからないのですが
whereじゃなくて連結の条件にしてみては?

SELECT u.user_email, m.meta_value
FROM wp_users AS u
LEFT JOIN wp_usermeta AS m
ON u.ID = m.user_id
and m.meta_key = 'user_name'

投稿日時 - 2012-06-22 16:58:58

お礼

ありがとうございました。
速度も圧倒的にこちらが速かったです。
18290 rows in set (2.22 sec)

ONにANDをつけられることを初めて知りました・・
ネットで検索・質問の前にリファレンスを読んでおきます

投稿日時 - 2012-06-22 17:45:33

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問