2012-05-24 30 views
14

Tôi muốn tạo một khung nhìn từ cả bảng wp_users và wp_usermeta để tôi có thể truy vấn các hàng trong khung nhìn từ một ứng dụng bên ngoài. Chi tiết xác thực cơ bản được lưu trữ trong wp_users (ví dụ: tên người dùng, mật khẩu, email, id) và các trường khác được lưu trữ trong cặp khóa/giá trị trong bảng wp_usermeta.Người dùng Wordpress và usermeta - nối nhiều hàng trong một bảng vào một hàng trong một bảng khác

bảng wp_users được cấu trúc như thế này:

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

bảng wp_usermeta được cấu trúc như thế này:

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 

Tôi muốn kết thúc với dữ liệu như thế này như một VIEW MYSQL:

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

Tôi biết tôi cần phải làm ít nhất một sự liên kết bên trong giữa wp_users và wp_usermeta, tuy nhiên tôi cũng cần thực hiện truy vấn phụ bên trong wp_usermeta để nối các hàng đó lại với nhau.

Truy vấn tôi có để nhận được hàng sử dụng tất nhiên là chết dễ dàng:

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

Truy vấn tôi có để nhận được meta như một hàng này là:

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' 

Vì vậy, làm thế nào để Tôi tham gia hai truy vấn này cùng nhau - dữ liệu của u1 và hàng u1.id = m1.userid?

+0

Bạn đang có kế hoạch tìm kiếm người dùng dựa trên một số đặc tính meta_value? nếu không, bạn chỉ có thể lưu trữ các thuộc tính trong một trường meta_value được tuần tự hóa đơn (mã hóa json hoặc mã hóa php) – Ben

+0

@Ben: nope, một ứng dụng bên ngoài sẽ kết nối để truy vấn dữ liệu tương tác – frumbert

Trả lời

4

tôi thấy rằng tác phẩm giải pháp Toote nhưng là một con heo hiệu suất trên một MySQL cơ sở dữ liệu mất khoảng 17 giây để thực thi "select * from users_with_meta_view".

Tôi nhận này xuống 0,0054 giây với một cái nhìn cấu trúc như thay vì điều này:

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

Theo như tôi biết, bạn đang làm việc đó một cách đúng đắn và chỉ cần đặt chúng lại với nhau:

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, bạn nói đúng đã nhìn thấy giải pháp phức tạp! cheers – frumbert

+2

Điều này rất hữu ích. Đối với những người dùng khác, nếu bạn đang làm điều đó trong wordpress (tôi không nghĩ rằng OP là), bạn sẽ muốn thay thế wp_usermeta và wp_users với $ wpdb-> usermeta & $ wpdb-> người dùng tương ứng. Chỉ cần FYI cho hậu thế. Câu trả lời khá hữu ích. – Jake

+0

Điều này thực sự giúp tôi tiết kiệm rất nhiều thời gian! – 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> 
} 
Các vấn đề liên quan