Compex MySQL Left Join unter Verwendung mehrerer Einträge aus Metatabellen

Lesezeit: 3 Minuten

Ich versuche, eine einzelne Abfrage zum Abrufen von Informationen aus der Haupttabelle (WordPress-Benutzertabelle) und der Benutzermetatabelle zu erstellen.

Wenn Sie mit der WP DB-Architektur nicht vertraut sind: wp_users enthält grundlegende Benutzerinformationen und ihre IDs, wp_usermeta enthält die ID, meta_key und meta_value.

Nehmen wir an, ich möchte alle Benutzer abrufen, die bestimmte meta_keys und meta_values ​​haben. Dies ist die Abfrage, die ich derzeit habe (generiert über PHP basierend auf verfügbaren meta_keys):

SELECT ID, 
user_email, 
user_login, 
first_name.meta_value as first_name,
last_name.meta_value as last_name,
phone_number.meta_value as phone_number,
wp_capabilities.meta_value as wp_capabilities 
FROM wp_users, 
(select * from wp_usermeta where meta_key = 'first_name') as first_name,
(select * from wp_usermeta where meta_key = 'last_name') as last_name,
(select * from wp_usermeta where meta_key = 'phone_number') as phone_number,
(select * from wp_usermeta where meta_key = 'wp_capabilities') as wp_capabilities 
WHERE  
ID = first_name.user_id AND 
ID = last_name.user_id AND 
ID = phone_number.user_id AND 
ID = wp_capabilities.user_id  AND 
wp_wpi_capabilities.meta_value LIKE '%administrator%'   
ORDER BY first_name

Dies macht einen guten Job, aber wenn einem bestimmten Benutzer ein meta_key fehlt, beispielsweise „last_name“, wird diese Benutzerzeile überhaupt nicht zurückgegeben. Also wirklich alles, was ich brauche, ist eine Möglichkeit, einen Nullwert für fehlende Metaschlüssel zurückzugeben.

Im Moment habe ich eine sehr hackige Funktion, die durchläuft und leere meta_keys und meta_values ​​für alle Benutzer erstellt, die keinen bestimmten meta_key haben, auf diese Weise werden sie zurückgegeben. Dies ist jedoch eine schreckliche Methode, wenn Sie über tausend Benutzer haben und einen neuen Typ von meta_key hinzufügen müssen.

Lassen Sie mich wissen, wenn jemand dies getan hat, oder wenn ich es besser erklären muss.

Danke.

  • Warum nicht die ersten 3 zu einem richtigen LEFT Join machen? gerade jetzt machen Sie richtige Joins ….

    – Wrikken

    17. September 2010 um 12:47 Uhr

Fügen Sie die Benutzermeta-Beitrittskriterien in den Join ein, anstatt mit Unterabfragen zu kämpfen:

SELECT
    ID, user_email, user_login, 
    first_name.meta_value as first_name,
    last_name.meta_value as last_name,
    phone_number.meta_value as phone_number,
    wp_capabilities.meta_value as wp_capabilities 
FROM wp_users
    JOIN wp_usermeta AS wp_capabilities ON wp_capabilities.user_id=ID
        AND wp_capabilities.meta_key='wp_capabilities'
    LEFT JOIN wp_usermeta AS first_name ON first_name.user_id=ID
        AND first_name.meta_key='first_name'
    LEFT JOIN wp_usermeta AS last_name ON last_name.user_id=ID
        AND last_name.meta_key='last_name'
    LEFT JOIN wp_usermeta AS phone_number ON phone_number.user_id=ID
        AND phone_number.meta_key='phone_number'
WHERE
    wp_capabilities.meta_value LIKE '%administrator%'
ORDER BY
    first_name

  • Ich hätte nie gedacht, dass du so etwas kannst, das hilft wirklich sehr!

    – Jöckchen

    17. Dezember 2012 um 12:30 Uhr

1001730cookie-checkCompex MySQL Left Join unter Verwendung mehrerer Einträge aus Metatabellen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy