2010-09-17 54 views
2

我想創建一個查詢從主表(WordPress用戶表)和用戶元表獲取信息。Compex MySQL左連接使用meta表中的多個條目

如果您不熟悉WP DB體系結構:wp_users包含基本用戶信息及其ID,wp_usermeta包含ID,meta_key和meta_value。

比方說,我想讓所有具有特定meta_keys和meta_values的用戶。這是我現在有(基於可用meta_keys通過PHP產生)查詢:

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 

這做得很好,但是如果某個用戶缺少實例meta_key,「姓氏」,即用戶行不根本沒有得到回報。所以我真正需要的是一種爲缺失的元鍵返回Null值的方法。

現在,我有一個非常黑客的函數,它會爲所有沒有給定meta_key的用戶創建空白的meta_keys和meta_values,並返回它們。這是一個很糟糕的方式,雖然當你有超過一千個用戶時,你需要添加一個新的meta_key類型。

讓我知道是否有人這樣做,或者如果我需要更好地解釋。

謝謝。

+0

爲什麼不把它的第3適當LEFT JOIN?現在你正在做正確的連接.... – Wrikken 2010-09-17 12:47:49

回答

14

把usermeta的加入而加入的標準不是與子查詢掙扎:

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

太棒了,就是這樣。 – Andy 2010-09-17 14:28:55

+0

我從來不知道你可以這樣做,這實際上有很大幫助! – jocken 2012-12-17 12:30:46