2012-05-24 18 views
14

Hem wp_users ve wp_usermeta tablolarından bir görünüm oluşturmak istiyorum, böylece harici bir uygulamadan görünümde satırları sorgulayabiliyorum. Temel kimlik bilgileri wp_users (ör. Kullanıcı adı, şifre, e-posta, kimlik) içinde saklanır ve diğer alanlar wp_usermeta tablosundaki anahtar/değer çiftlerinde saklanır.WordPress kullanıcıları ve birden fazla satırı bir tabloda bir satırda başka bir tabloya birleştirmek

wp_users tablo bu gibi yapılandırılmıştır:

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

wp_usermeta tablo bu gibi yapılandırılmıştır: Bir MYSQL GÖRÜNÜM olarak böyle veriler oluşursa istiyorum

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 

:

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

En azından wp_users ve wp_usermeta arasında bir iç birleştirme yapmam gerektiğini biliyorum. Bu satırları bir araya getirmek için wp_usermeta içinde bir alt sorgu gerçekleştirmeniz gerekir.

Ben kullanıcı satır almak için var sorgu elbette ölü kolaydır:

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

Bir satır olarak meta almak için sahip sorgu şudur:

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' 

Yani bunu nasıl Bu iki sorguya birlikte katılıyorum - u1'in verileri ve satırın u1.id = m1.userid?

+0

bazı meta_value özelliklerine dayalı olarak kullanıcılara arama planlıyorsunuz? eğer değilse, sadece tek bir serileştirilmiş meta_değer alanı (json kodlanmış veya php serileştirilmiş) özniteliklerini saklayabilirsin – Ben

+0

@Ben: nope, veriyi etkileşimli olarak sorgulamak için harici bir uygulama bağlanacak – frumbert

cevap

4

O Toote çözümü eserlerini buldum ama bir MySQL üzerinde performans domuz veritabanı "users_with_meta_view" ten * seçmek için yaklaşık 17 saniye sürüyor. bir bakış açısıyla 0.0054 sn bu indim ben

artık şöyle yapılandırılmış:

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

Bildiğim kadarıyla, bunu doğru şekilde yaptığını bilen ve sadece hepsini bir araya gerekir olarak:

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

gar, tabi ki ben karmaşık çözümü görüyordu! şerefe – frumbert

+2

Bu çok yardımcı oldu. Diğer kullanıcılar için, eğer wordpress içinde yapıyorsanız (OP'nin olduğunu sanmıyorum), sırasıyla wp_usermeta ve wp_users ile $ wpdb-> usermeta & $ wpdb-> kullanıcılarını değiştirmek istersiniz. Sadece posteri için FYI. Oldukça kullanışlı bir cevap. – Jake

+0

Bu gerçekten bana çok zaman kazandırdı! – 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> 
} 
İlgili konular