Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête MySQL - Joignez les données en fonction de deux facteurs, puis personnalisez la façon dont les données sont triées en fonction des valeurs

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

Tout d'abord, comme d'autres l'ont mentionné, l'une des raisons pour lesquelles cette requête est si lourde à écrire est que vous devez utiliser une structure EAV. Le concept d'une "méta" table est vraiment un anathème pour le design relationnel. Deuxièmement, pour extraire des informations d'un EAV, vous devez créer ce qu'on appelle une requête analyse croisée dans laquelle vous créez les colonnes souhaitées dans votre requête. En général, les bases de données relationnelles ne sont pas conçues pour la génération de colonnes à la volée comme je le fais dans ma solution et est nécessaire pour les EAV.