Пользователи Wordpress и usermeta-объединение нескольких строк в одной таблице в одну строку в другой таблице
Я хочу создать представление из таблиц wp_users и wp_usermeta, чтобы я мог запрашивать строки в представлении из внешнего приложения. Основные данные auth хранятся в wp_users (например, имя пользователя, пароль, электронная почта, id), а другие поля хранятся в парах ключ/значение в таблице wp_usermeta.
таблица wp_users структурирована следующим образом:
id | login | password | email
-----------------------------
1 | bsmith| abc123 | b@foo.com
2 | jjones| def456 | k@bah.com
таблица 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 | b@foo.com| bob | smith | denmark
2 | jjones| def456 | k@bah.com| 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 = М1.userid?
3 ответов
Я обнаружил, что решение Toote работает, но является свиньей производительности в базе данных MySQL, занимающей около 17 секунд, чтобы выполнить "select * from users_with_meta_view".
Я получил это до 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
насколько я знаю, вы делаете это правильно и просто нужно собрать их все вместе:
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
$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>
<?php } ?>