加入用户和usermeta表-WordPress

时间:2019-07-07 17:59:57

标签: wordpress

我想从usersusermeta表中选择列。

这是我的查询

$sql = $wpdb->prepare(
    "SELECT {$wpdb->users}.ID FROM {$wpdb->users} 
    WHERE {$wpdb->users}.user_registered <= '%s' 
    AND {$wpdb->usermeta}.meta_key='custom_status' 
    AND {$wpdb->usermeta}.meta_value=0
    INNER JOIN {$wpdb->usermeta} ON {$wpdb->users}.ID= {$wpdb->usermeta}.user_id", $before);

,但不会选择任何内容。我知道我有一个用户meta_valueuser_registered少于当前日期时间($before)。

$before就是这样:2019-07-06 19:03:55

1 个答案:

答案 0 :(得分:1)

问题在于您将%s占位符用单引号引起来。这不是必需的,因为WordPress将用包含您传递给%s方法的值的正确字符串替换prepare()的所有实例。

因此,考虑到这一点,您的代码将变为:

$sql = $wpdb->prepare(
    "SELECT {$wpdb->users}.ID FROM {$wpdb->users} 
    WHERE {$wpdb->users}.user_registered <= %s 
    AND {$wpdb->usermeta}.meta_key='custom_status' 
    AND {$wpdb->usermeta}.meta_value=0
    INNER JOIN {$wpdb->usermeta} ON {$wpdb->users}.ID= {$wpdb->usermeta}.user_id", $before);

此外,查询的INNER JOIN ...部分必须放在WHERE子句之前,否则MySQL会抛出无效的语法错误:

$sql = $wpdb->prepare(
    "SELECT {$wpdb->users}.ID FROM {$wpdb->users} 
    INNER JOIN {$wpdb->usermeta} ON {$wpdb->users}.ID= {$wpdb->usermeta}.user_id
    WHERE {$wpdb->users}.user_registered <= %s 
    AND {$wpdb->usermeta}.meta_key='custom_status' 
    AND {$wpdb->usermeta}.meta_value=0", $before);