Пользователи Wordpress и usermeta - объединение нескольких строк в одну таблицу в одну строку в другую таблицу

Я хочу создать представление из таблиц wp_users и wp_usermeta, чтобы я мог запрашивать строки в представлении из внешнего приложения. Основные данные аутентификации хранятся в wp_users (например, имя пользователя, пароль, адрес электронной почты, идентификатор), а другие поля хранятся в парах ключ/значение в таблице wp_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 VIEW:

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?

Ответы

Ответ 1

Я обнаружил, что решение 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

Ответ 2

Насколько я знаю, вы делаете это правильно и просто должны собрать все вместе:

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

Ответ 3

$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 } ?>

Ответ 4

спасибо за ответ на переполнение стека!

Пожалуйста, обязательно ответьте на вопрос. Предоставьте детали и поделитесь своими исследованиями! Но избегайте...

Обращение за помощью, разъяснения или ответы на другие ответы. Делая ул