web-dev-qa-db-ja.com

Wp_usermetaテーブルを持つmysqlクエリでGROUP_CONCATを使用する

Wordpressのテーブルからユーザーの詳細を返すためのクエリがあります。私が欲しいだけのカラム名をSELECTしていたとしても大丈夫でしょう、しかしWordpressの中に2つのカラムを持つusermetaテーブルがあります - 1はmetakeyと呼ばれ、もう1つはmeta valueと呼ばれます。

First_nameやlast_nameなどのメタキーから特定のユーザー情報を取得したいのですが、それらはすべて同じ列内にあります - メタ値。

これは私が持っているものです:

    $allquery="SELECT $comma_separated, wp_usermeta.meta_value, wp_usermeta.meta_key, 
//comma_seperated are a list of values to search for seperate by ",". this is name, email
    GROUP_CONCAT(
        wp_usermeta.meta_value
        ORDER BY wp_usermeta.meta_key
    ) AS name
    FROM wp_users
    LEFT JOIN wp_usermeta
    ON wp_users.ID = wp_usermeta.user_id
    WHERE  (wp_usermeta.meta_key = 'first_name'
        OR wp_usermeta.meta_key = 'last_name')
        AND wp_users.user_login = '$spec_user'
    GROUP BY wp_users.ID";

    $names = array();
    $allresult=mysql_query($allquery) or die(mysql_error()); 

    while($rows=mysql_fetch_array($allresult)){  

        $names[] = $rows['name']; //name is from the group_concat in query
        $emails[] = $rows['user_email']; 
    }

問題は、これは単一行を返すことです。私はそれがラインと関係があるかもしれないと思う:

AND wp_users.user_login = '$ spec_user'

$ spec_userはユーザーが入力した値です。

理想的なのは、user_login列がユーザーが入力したものと等しい場所にすべての行が返されることです。そのテーブルからだけでなく、usermetaテーブルからも。

1
JamesG

ピボットクエリはどうですか。

これは、first_name、last_name、user_loginを持つ行を返します。その後、WHERE句を使用して、必要な条件を追加できます。

            SELECT

                    MAX(CASE WHEN wp_usermeta.meta_key = 'first_name' then wp_usermeta.meta_value ELSE NULL END) as first_name,
                    MAX(CASE WHEN wp_usermeta.meta_key = 'last_name' then wp_usermeta.meta_value ELSE NULL END) as last_name,
                    wp_users.user_login

                    FROM wp_users

                    LEFT JOIN wp_usermeta
                    ON wp_users.ID = wp_usermeta.user_id

                    GROUP BY wp_users.user_login
1
Ethan Seifert