sql >> Base de Datos >  >> RDS >> Mysql

Consulta de MySQL:una los datos en función de dos factores y, a continuación, personalice la forma en que se ordenan los datos en función de los 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

Primero, como han mencionado otros, una de las razones por las que esta consulta es tan engorrosa de escribir es que tiene que usar una estructura EAV. El concepto de una "metatabla" es realmente un anatema para el diseño relacional. En segundo lugar, para obtener información de un EAV, debe crear lo que se denomina una consulta de tabulación cruzada donde crea las columnas que desea en su consulta. En general, las bases de datos relacionales no están diseñadas para la generación de columnas sobre la marcha, como lo hago en mi solución, y son necesarias para los EAV.