19

外部アプリケーションからビュー内の行を照会できるように、wp_users テーブルと wp_usermeta テーブルの両方からビューを作成したいと考えています。基本認証の詳細は wp_users (ユーザー名、パスワード、電子メール、ID など) に保存され、その他のフィールドは wp_usermeta テーブルのキーと値のペアに保存されます。

wp_users テーブルは次のように構成されています。

id | login | password | email
-----------------------------
1  | bsmith| abc123   | b@foo.com
2  | jjones| def456   | k@bah.com

wp_usermeta テーブルは次のように構成されています。

id | user_id | meta_key | meta_value
------------------------------------
1  | 1       | firstname| bob
2  | 1       | lastname | smith
3  | 1       | country  | denmark
4  | 2       | firstname| jan
5  | 2       | lastname | jones
6  | 2       | country  | germany

MYSQL VIEW として次のようなデータを取得したいと考えています。

id | login | password | email    | firstname | lastname | country
-----------------------------------------------------------------
1  | bsmith| abc123   | b@foo.com| bob       | smith    | denmark
2  | jjones| def456   | k@bah.com| jan       | jones    | germany

少なくとも wp_users と wp_usermeta の間で内部結合を行う必要があることはわかっていますが、これらの行を結合するには wp_usermeta 内でサブクエリを実行する必要もあります。

もちろん、ユーザー行を取得するためのクエリは非常に簡単です。

select u1.id, u1.login, u1.password, u1.email from wp_users u1

メタを行として取得するためのクエリは次のとおりです。

select m1.user_id, m1.meta_value as firstname, m2.meta_value as lastname, m3.meta_value as country
from wp_usermeta m1
join wp_usermeta m2 on (m1.user_id = m2.user_id and m2.meta_key = 'last_name')
join wp_usermeta m3 on (m2.user_id = m3.user_id and m3.meta_key = 'country')
where m1.meta_key = 'first_name'

では、これら 2 つのクエリ (u1 のデータと u1.id = m1.userid の行) を結合するにはどうすればよいでしょうか?

4

3 に答える 3

37

私の知る限り、あなたはそれを正しい方法で行っており、それらをすべてまとめる必要があります。

SELECT
    u1.id,
    u1.login,
    u1.password,
    u1.email,
    m1.meta_value AS firstname,
    m2.meta_value AS lastname,
    m3.meta_value AS country
FROM wp_users u1
JOIN wp_usermeta m1 ON (m1.user_id = u1.id AND m1.meta_key = 'first_name')
JOIN wp_usermeta m2 ON (m2.user_id = u1.id AND m2.meta_key = 'last_name')
JOIN wp_usermeta m3 ON (m3.user_id = u1.id AND m3.meta_key = 'country')
WHERE
    -- CONDITIONS ON the user you want to select based any field
于 2012-05-24T04:30:44.100 に答える