返回至少有一篇帖子的作者ID

时间:2011-04-07 作者:Brooke.

我找到了一段很棒的代码here 它按角色返回用户的ID。我想做的是修改它,以便它只返回至少有一篇帖子的用户的ID。我已经试过了INNER JOIN 这个$wpdb->posts 我觉得我做得对,但不确定。以下是我目前掌握的情况:

function getUsersByRole( $roles ) {
    global $wpdb;
    if ( ! is_array( $roles ) ) {
        $roles = explode( ",", $roles );
        array_walk( $roles, \'trim\' );
    }
    $sql = \'
        SELECT  ID, display_name
        FROM \' . $wpdb->users . \' INNER JOIN \' . $wpdb->usermeta . \' ON \' . $wpdb->users . \'.ID=\' . $wpdb->usermeta . \'.user_id
        AND INNER JOIN \'. $wpdb->posts .\'  ON \' .$wpdb->users . \'.ID=\' . $wpdb->posts . \'.post_author
        WHERE   \' . $wpdb->usermeta . \'.meta_key        =       \\\'\' . $wpdb->prefix . \'capabilities\\\' 
        AND     (
    \';
    $i = 1;
    foreach ( $roles as $role ) {
        $sql .= \' \' . $wpdb->usermeta . \'.meta_value    LIKE    \\\'%"\' . $role . \'"%\\\' \';
        if ( $i < count( $roles ) ) $sql .= \' OR \';
        $i++;
    }
    $sql .= \' ) \';
    $sql .= \' ORDER BY display_name \';
    $userIDs = $wpdb->get_col( $sql );
    return $userIDs;
}
SQL查询输出的

选择ID,在wp\\U用户上显示wp\\U用户名内部加入wp\\U usermeta。ID=ba\\U usermeta。user\\u id和INNER JOIN wp\\u在wp\\u用户上发布的帖子。ID=ba\\U立柱。post\\u author WHERE wp\\u usermeta。meta\\u键=\'wp\\u功能\'和(wp\\u usermeta.meta\\u值,如“%”author“%”或wp\\u usermeta.meta\\u值,如“%”editor“%”),按display\\u名称排序

我从来没用过INNER JOIN (或JOIN) 所以我可能做错了。我还认为我需要做一个计数或其他事情来确保我得到一个结果。

任何帮助都会很棒

EDIT: 下面是PHP的完整工作函数,供以后找到它的人使用

    function getUsersByRole( $roles ) {
    global $wpdb;
    if ( ! is_array( $roles ) ) {
        $roles = explode( ",", $roles );
        array_walk( $roles, \'trim\' );
    }
    $sql = \'SELECT ID, display_name
        FROM \'. $wpdb->users .\'
        JOIN \'. $wpdb->usermeta.\' ON (\'.$wpdb->users.\'.ID = \'.$wpdb->usermeta.\'.user_id AND \'.$wpdb->usermeta.\'.meta_key = \\\'\'.$wpdb->prefix.\'capabilities\\\')
        WHERE ID IN (SELECT post_author FROM \' .$wpdb->posts.\')
        AND(\';
    $i = 1;
    foreach ( $roles as $role ) {
        $sql .= \' \' . $wpdb->usermeta . \'.meta_value    LIKE    \\\'%"\' . $role . \'"%\\\' \';
        if ( $i < count( $roles ) ) $sql .= \' OR \';
        $i++;
    }
    $sql .= \' ) \';
    $sql .= \' ORDER BY display_name \';
    $userIDs = $wpdb->get_col( $sql );

    return $userIDs;
}

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

而不是JOIN, 您可以使用IN 对于子查询,要防止由于联接而导致重复结果,请执行以下操作:

SELECT ID, display_name
FROM wp_users
WHERE ID IN (SELECT post_author FROM wp_posts)
这将不考虑功能。如果还需要,可以像加入一样添加它们,但移动meta_key 子句,还可以防止重复结果:

SELECT ID, display_name
FROM wp_users
    JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id AND wp_usermeta.meta_key = \'wp_capabilities\')
WHERE ID IN (SELECT post_author FROM wp_posts)
    AND (wp_usermeta.meta_value LIKE \'%"author"%\'
        OR wp_usermeta.meta_value LIKE \'%"editor"%\' )
由您决定是否将其转换回PHP!旁注:是wp_ 在里面wp_capabilities 取决于数据库前缀,还是始终如此wp_, 即使您的表名以另一个前缀开头?

结束