Wordpress 用户和用户元 - 将一个表中的多行连接到另一个表中的一行

Posted

技术标签:

【中文标题】Wordpress 用户和用户元 - 将一个表中的多行连接到另一个表中的一行【英文标题】:Wordpress users and usermeta - joining multiple rows in one table to one row in another table 【发布时间】:2012-05-30 15:31:00 【问题描述】:

我想从 wp_users 和 wp_usermeta 表中创建一个视图,以便我可以从外部应用程序查询视图中的行。基本身份验证详细信息存储在 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 VIEW 的形式得到这样的数据:

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 = m1.userid 所在的行?

【问题讨论】:

您是否打算根据一些 meta_value 属性搜索用户?如果没有,您可以将属性存储在单个序列化 meta_value 字段中(json 编码或 php 序列化) @Ben : 不,将连接一个外部应用程序以交互方式查询数据 【参考方案1】:

据我所知,您的做法是正确的,只需将它们放在一起即可:

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

【讨论】:

gar,你说得对,当然我看到的是复杂的解决方案!欢呼 这很有帮助。对于其他用户,如果您在 wordpress 中执行此操作(我认为 OP 不是),您可能希望分别用 $wpdb->usermeta 和 $wpdb->users 替换 wp_usermeta 和 wp_users 。仅供后人参考。非常有用的答案。 这真的为我节省了大量时间! 抱歉,Toote *** 不允许我对您的回答进行多次投票。这是一个古老但功能强大的查询。谢谢 感谢它为我工作......在此之前我的查询需要大约 65 秒才能执行,现在它在 3 秒内执行【参考方案2】:

我发现 Toote 的解决方案有效,但在 MySQL 数据库上执行“select * from users_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

【讨论】:

【参考方案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  ?>

【讨论】:

以上是关于Wordpress 用户和用户元 - 将一个表中的多行连接到另一个表中的一行的主要内容,如果未能解决你的问题,请参考以下文章

sql 删除WordPress中的所有孤儿用户元

sql 删除WordPress中的所有孤儿用户元

sql 删除WordPress中的所有孤儿用户元

sql 删除WordPress Raw中的所有孤儿用户元

使 WordPress 用户元数据可用于 Rest-API

在 Wordpress 用户元数据库中存储 PHP 数组