Select wp_users.ID
, wp_users.user_login
, wp_users.user_email
, wp_users.user_nicename
, Min( Case When wp_usermeta.meta_key = 'first_name' Then wp_usermeta.meta_value End ) As first_name
, Min( Case When wp_usermeta.meta_key = 'last_name' Then wp_usermeta.meta_value End ) As last_name
, Min( Case When wp_usermeta.meta_key = 'address' Then wp_usermeta.meta_value End ) As address
, Min( Case When wp_usermeta.meta_key = 'dob' Then wp_usermeta.meta_value End ) As dob
From wp_user
Join wp_usermeta
On wp_usermeta.user_id = wp_user.ID
Where Exists (
Select 1
From wp_usermeta As Meta1
Where Meta1.user_id = wp_user.id
And Meta1.meta_key = 'wp_user_level'
And Meta1.meta_value = '0'
)
And wp_usermeta.meta_key In('first_name','last_name','address','dob')
Group By wp_users.ID
, wp_users.user_login
, wp_users.user_email
, wp_users.user_nicename
Primeiro, como outros já mencionaram, uma das razões pelas quais essa consulta é tão complicada de escrever é que você está tendo que usar uma estrutura EAV. O conceito de uma tabela "meta" é realmente um anátema para o design relacional. Em segundo lugar, para obter informações de um EAV, você precisa criar o que é chamado de consulta de tabela cruzada, onde você constrói as colunas que deseja em sua consulta. Em geral, os bancos de dados relacionais não são projetados para geração de colunas em tempo real, como estou fazendo na minha solução, e são necessários para EAVs.