Mysql
 sql >> Database >  >> RDS >> Mysql

Query MySQL:unisci i dati in base a due fattori, quindi personalizza il modo in cui i dati vengono ordinati in base ai valori

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

Innanzitutto, come altri hanno già detto, uno dei motivi per cui questa query è così ingombrante da scrivere è che devi utilizzare una struttura EAV. Il concetto di tavolo "meta" è davvero un anatema per il design relazionale. In secondo luogo, per ottenere informazioni da un EAV, devi creare quella che viene chiamata una query a campi incrociati in cui crei le colonne che desideri nella tua query. In generale, i database relazionali non sono progettati per la generazione di colonne al volo come sto facendo nella mia soluzione ed è necessario per gli EAV.