2010-09-17 26 views
2

J'essaie de créer une seule requête pour obtenir des informations de la table principale (table utilisateur WordPress), et la table méta de l'utilisateur. Si vous n'êtes pas familier avec l'architecture WP DB: wp_users contient des informations utilisateur de base et leurs ID, wp_usermeta contient l'ID, meta_key et meta_value.Compex MySQL Left Joindre en utilisant plusieurs entrées à partir de tables méta

Disons que je veux obtenir tous les utilisateurs qui ont certaines méta_keys et meta_values. Ceci est la requête que j'ai actuellement (généré par PHP basé sur meta_keys disponibles):

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 

Cela fait un bon travail, si un utilisateur manque un meta_key, « last_name », par exemple, cette ligne d'utilisateur ne ne pas être renvoyé du tout. Donc, tout ce dont j'ai besoin est une façon de retourner une valeur Null pour les clés méta manquantes.

Maintenant j'ai une fonction très hackish qui traverse et crée des meta_keys et des meta_values ​​vides pour tous les utilisateurs qui n'ont pas de méta_key donnée, de cette façon ils sont retournés. C'est une manière terrible de le faire cependant quand vous avez plus d'un millier d'utilisateurs, et vous devez ajouter un nouveau type de meta_key. Faites-moi savoir si quelqu'un l'a fait, ou si j'ai besoin de mieux expliquer.

Merci.

+0

Pourquoi ne pas en faire le premier 3 une jointure GAUCHE appropriée? en ce moment vous faites des jointures droites .... – Wrikken

Répondre

14

Mettre les critères de rejoindre usermeta dans la jointure plutôt que de lutter avec les sous-requêtes:

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 
+0

Génial, c'est ce qu'il a fait. – Andy

+0

Je n'ai jamais su que tu pouvais faire comme ça, ça aide beaucoup! – jocken