这是关于一个Wordpress网站。
有 2 张表。 1 个叫 wp_users
个,1 个叫wp_usermeta
。
这两个表通过wp_users.id = wp_usermeta.user_id
链接。
Usermeta 有一个名为 meta_key
和 meta_value
的列。1 个用户有多个meta_key
,但每个meta_key
都有一个meta_value
。
我想要的如下,
我想从wp_users
中选择ID
、user_login
和user_email
,从wp_usermeta
中选择meta_value
,其中meta_key
='foobar'。但是,查询需要以这样的方式进行:如果有人使用搜索,它仍然会找到相同的内容,但前提是user_login
、user_email
或meta_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 '%...%'