2012-05-24 18 views
14

मैं wp_users और wp_usermeta टेबल दोनों से एक दृश्य बनाना चाहता हूं ताकि मैं बाहरी अनुप्रयोग से दृश्य में पंक्तियों से पूछताछ कर सकूं। मूल लेख विवरण wp_users (जैसे उपयोगकर्ता नाम, पासवर्ड, ईमेल, आईडी) में संग्रहीत हैं और अन्य फ़ील्ड wp_usermeta तालिका में कुंजी/मान जोड़े में संग्रहीत हैं।वर्डप्रेस उपयोगकर्ता और usermeta - एक तालिका में एक पंक्ति में एक पंक्ति में एकाधिक पंक्तियों में एक पंक्ति में

wp_users तालिका इस तरह संरचित है:

id | login | password | email 
----------------------------- 
1 | bsmith| abc123 | [email protected] 
2 | jjones| def456 | [email protected] 

wp_usermeta तालिका इस तरह संरचित है:

id | user_id | meta_key | meta_value 
------------------------------------ 
1 | 1  | firstname| bob 
2 | 1  | lastname | smith 
3 | 1  | country | denmark 
4 | 2  | firstname| jan 
5 | 2  | lastname | jones 
6 | 2  | country | germany 

मैं ने MySQL दृश्य के रूप में इस तरह के डेटा के साथ खत्म करना चाहते हैं:

id | login | password | email | firstname | lastname | country 
----------------------------------------------------------------- 
1 | bsmith| abc123 | [email protected]| bob  | smith | denmark 
2 | jjones| def456 | [email protected]| jan  | jones | germany 

मुझे पता है कि मुझे wp_users और wp_usermeta के बीच कम से कम एक आंतरिक भागीदारी करने की आवश्यकता है, हालांकि मैं भी उन पंक्तियों में शामिल होने के लिए wp_usermeta के अंदर एक उप क्वेरी करने की आवश्यकता है।

क्वेरी मैं उपयोगकर्ता पंक्ति प्राप्त करने के लिए है निश्चित रूप से मृत आसान है:

select u1.id, u1.login, u1.password, u1.email from wp_users u1 

क्वेरी मैं एक पंक्ति के रूप में मेटा प्राप्त करने के लिए है यह है:

select m1.user_id, m1.meta_value as firstname, m2.meta_value as lastname, m3.meta_value as country 
from wp_usermeta m1 
join wp_usermeta m2 on (m1.user_id = m2.user_id and m2.meta_key = 'last_name') 
join wp_usermeta m3 on (m2.user_id = m3.user_id and m3.meta_key = 'country') 
where m1.meta_key = 'first_name' 

तो कैसे करना है मैं इन दोनों प्रश्नों को एक साथ जोड़ता हूं - u1 का डेटा और पंक्ति जहां u1.id = m1.userid?

+0

आप उन कुछ meta_value गुणों के आधार पर खोज करने की योजना बना रहे हैं? यदि नहीं, तो आप केवल एक सिंगल सीरियलाइज्ड मेटा_वल्यू फ़ील्ड (जेसन एन्कोडेड, या पीएचपी सीरियलाइज्ड) में गुणों को स्टोर कर सकते हैं – Ben

+0

@ बेन: नहीं, एक बाहरी ऐप इंटरैक्टिव रूप से – frumbert

उत्तर

4

मुझे लगता है कि टूटे समाधान काम करता पाया लेकिन एक MySQL पर एक प्रदर्शन हॉग है "user_with_meta_view" से "चयन * निष्पादित करने के लिए डेटाबेस को लगभग 17 सेकंड लगते हैं।

मैं एक दृश्य के साथ 0.0054 सेकंड के लिए नीचे यह मिल गया यह बजाय तरह संरचित:

CREATE OR REPLACE VIEW users_with_meta_view AS 
SELECT 
    u.id, 
    u.user_login AS login, 
    u.user_pass AS password, 
    u.user_email AS email, 
    (select meta_value from wp_usermeta where user_id = u.id and meta_key = 'first_name' limit 1) as first_name, 
    (select meta_value from wp_usermeta where user_id = u.id and meta_key = 'last_name' limit 1) as last_name, 
    (select meta_value from wp_usermeta where user_id = u.id and meta_key = 'country' limit 1) as country 
FROM wp_users u 
29

जहाँ तक मुझे पता है, आप इसे सही तरीके से कर रहे हैं और सिर्फ उन सब को एक साथ रखा करने की आवश्यकता के रूप में:

SELECT 
    u1.id, 
    u1.login, 
    u1.password, 
    u1.email, 
    m1.meta_value AS firstname, 
    m2.meta_value AS lastname, 
    m3.meta_value AS country 
FROM wp_users u1 
JOIN wp_usermeta m1 ON (m1.user_id = u1.id AND m1.meta_key = 'first_name') 
JOIN wp_usermeta m2 ON (m2.user_id = u1.id AND m2.meta_key = 'last_name') 
JOIN wp_usermeta m3 ON (m3.user_id = u1.id AND m3.meta_key = 'country') 
WHERE 
    -- CONDITIONS ON the user you want to select based any field 
+0

गार डेटा से पूछताछ करने के लिए कनेक्ट हो जाएगा, आप निश्चित रूप से सही हैं जटिल समाधान देख रहा था! चीयर्स – frumbert

+2

यह बहुत उपयोगी था। अन्य उपयोगकर्ताओं के लिए, यदि आप वर्डप्रेस के भीतर ऐसा कर रहे हैं (मुझे नहीं लगता कि ओपी था), तो आप क्रमशः $ wpdb-> usermeta और $ wpdb-> उपयोगकर्ताओं के साथ wp_usermeta और wp_users को प्रतिस्थापित करना चाहते हैं। वंशावली के लिए बस एफवाईआई। बहुत उपयोगी जवाब। – Jake

+0

यह वास्तव में मुझे एक टन बचाया! – Scorpius

-1
$sql= "SELECT 
     u1.parent_id, 
     m1.meta_value AS headline, 
     m2.meta_value AS profilephoto 
     FROM wp_vandor u1 
     JOIN wp_usermeta m1 ON (m1.user_id = u1.child_id AND m1.meta_key = 'headline') 
     JOIN wp_usermeta m2 ON (m2.user_id = u1.child_id AND m2.meta_key = 'profilephoto') 
     WHERE m1.user_id != $currentuser_id"; 

$classifieds = $wpdb->get_results($sql); 

foreach ($classifieds as $classified) { ?> 
    <p><?php echo $classified->profilephoto; ?></p> 
    <h3><?php echo $classified->headline; ?></h3> 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^