SQL 查询在联接表中仅获取 1 个值


sql query get only 1 value of many in a joined table

这是关于一个Wordpress网站。

有 2 张表。 1 个叫 wp_users 个,1 个叫wp_usermeta
这两个表通过wp_users.id = wp_usermeta.user_id链接。
Usermeta 有一个名为 meta_keymeta_value 的列。1 个用户有多个meta_key,但每个meta_key都有一个meta_value

我想要的如下,

我想从wp_users中选择IDuser_loginuser_email,从wp_usermeta中选择meta_value,其中meta_key='foobar'。但是,查询需要以这样的方式进行:如果有人使用搜索,它仍然会找到相同的内容,但前提是user_loginuser_emailmeta_value包含搜索的字符串。

这是我目前拥有的。我尝试过加入表格,但我不确定如何做到这一点。

public function get_users($get_from, $per_page, $search = null) {
    global $wpdb;
    $sql =      "SELECT ID, user_login username, user_email FROM {$wpdb->prefix}users";
    if(isset($search)) {
        $sql .= " WHERE user_login LIKE '%" . esc_sql($wpdb->esc_like($search)) . "%'";
        $sql .= " OR user_email LIKE '%" . esc_sql($wpdb->esc_like($search)) . "%'";
    }
    if(!empty($_REQUEST['orderby'])){ 
        $sql .= " ORDER BY " . esc_sql($_REQUEST['orderby']);
        $sql .= !empty($_REQUEST['order']) ? ' ' . esc_sql($_REQUEST['order']) : ' ASC';
    }
    $sql .= " LIMIT $get_from , $per_page";
    echo $sql;
    $result = $wpdb-> get_results($sql, 'ARRAY_A');
    $this->total_users = $wpdb->num_rows;
    return $result;
}

我宁愿使用联合,根据我的经验,它比一系列 or 条件更快。

SELECT ID, user_login username, user_email
FROM users
WHERE user_login LIKE '%...%'
UNION DISTINCT
SELECT ID, user_login username, user_email
FROM users
WHERE user_email LIKE '%...%'
UNION DISTINCT
SELECT ID, user_login username, user_email
FROM users
INNER JOIN wp_usermeta ON users.id=wp_usermeta.user_id
WHERE wp_usermeta.meta_key='foobar' and wp_usermeta.meta_value LIKE '%...%'

或者,您可以将 3 个字段连接成一个,并在连接的字符串上类似:

SELECT ID, user_login username, user_email
FROM users
LEFT JOIN wp_usermeta ON users.id=wp_usermeta.user_id
AND wp_usermeta.meta_key='foobar' 
WHERE concat_ws(',',user_login, user_email, coalesce(wp_usermeta.meta_value,'') LIKE '%...%'