从wp_usermeta同时查询名字和姓氏

时间:2015-06-02 作者:danjah

我试图使用wpdb对象和wp\\u usermeta表同时获取所有用户的first\\u name和last\\u name。我似乎不知道如何在同一个查询中同时获取这两个属性。下面是我到目前为止得到的。

global $wpdb;
    $ansatte = $wpdb->get_results("SELECT user_id, meta_value AS first_name FROM wp_usermeta WHERE meta_key=\'first_name\'");

    foreach ($ansatte as $ansatte) {
        echo $ansatte->first_name;
    }
使用上述代码,我能够呼出所有用户的名字,但我希望last\\u name也可用,如下所示;

foreach ($ansatte as $ansatte) {
        echo $ansatte->first_name . \' \' $ansatte->last_name;
    }
有什么想法吗?

3 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

我找不到一种干净的本地方式来提取这些数据。我可以想出几种方法来做到这一点:首先,类似于:

$sql = "
  SELECT user_id,meta_key,meta_value
  FROM {$wpdb->usermeta} 
  WHERE ({$wpdb->usermeta}.meta_key = \'first_name\' OR {$wpdb->usermeta}.meta_key = \'last_name\')";
$ansatte = $wpdb->get_results($sql);
var_dump($sql);
$users = array();
foreach ($ansatte as $a) {
  $users[$a->user_id][$a->meta_key] = $a->meta_value;
}
var_dump($users);
然后,您可以执行以下操作:

foreach ($users as $u) {
    echo $u[\'first_name\'].\' \'.$u[\'last_name\'];
}
。。。到echo 您的用户名。

第二种方法是一种更纯粹的SQL方法,您正在尝试:

$sql = "
  SELECT {$wpdb->usermeta}.user_id,{$wpdb->usermeta}.meta_value as first_name,m2.meta_value as last_name
  FROM {$wpdb->usermeta} 
  INNER JOIN {$wpdb->usermeta} as m2 ON {$wpdb->usermeta}.user_id = m2.user_id
  WHERE ({$wpdb->usermeta}.meta_key = \'first_name\' 
  AND m2.meta_key = \'last_name\')";
$ansatte = $wpdb->get_results($sql);

foreach ($ansatte as $ansatte) {
  echo $ansatte->first_name . \' \' . $ansatte->last_name;
}
您也可以使用get_users()WP_User_Query 要提取用户,但所需的meta\\u数据不在返回的数据中,检索它需要更多的工作。

SO网友:Willy Richardson

假设Wordpress表前缀为“wp\\u0”,这是phpMyAdmin的直接MySQL透视答案;

SELECT
  t1.id, t1.user_email,
  MAX(CASE WHEN t2.meta_key = \'first_name\' THEN meta_value END) AS first_name,
  MAX(CASE WHEN t2.meta_key = \'last_name\' THEN meta_value END) AS last_name 
FROM wp_users AS t1 
INNER JOIN wp_usermeta AS t2 ON t1.id = t2.user_id
GROUP BY t1.id, t1.user_email;

SO网友:William Entriken

这是只使用SQL的正确方法:

SELECT id
     , (SELECT MAX(meta_value) FROM wp_usermeta WHERE ID = wp_usermeta.user_id AND meta_key = \'first_name\') first_name
     , (SELECT MAX(meta_value) FROM wp_usermeta WHERE ID = wp_usermeta.user_id AND meta_key = \'last_name\') last_name
  FROM wp_users
以下是不起作用的方法:

因为wp\\u usermeta(user\\u id,meta\\u key)上没有唯一的键,所以对每个元数据字段进行一次连接不起作用,因为wp\\u usermeta(user\\u id,meta\\u key)上没有唯一的键,所以使用无MAX的子查询选择失败,因为wp\\u usermeta(user\\u id,meta\\u key)上没有唯一的键,而且由于某种原因,这比使用单个选择和连接更快。

结束