Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta MySQL - Junte dados com base em dois fatores e, em seguida, personalize a maneira como os dados são classificados com base em valores

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.