LEFT JOIN不太合适

时间:2013-02-19 19:24:46

标签: php mysql join left-join

我有两个表:userschanges。我想跟踪每个用户所做的更改次数。目前我在两个单独的语句中与PHP结合使用:

// Get all users
$stmt = GlobalContainer::$dbh->prepare("SELECT 
        id, username, realname
    FROM 
        users
    ORDER BY role_id, realname");
$stmt->execute();
while ($user = $stmt->fetch()) {
    $users[$user['id']] = $user;
    $users[$user['id']]['changes'] = 0;
}

// Get number of changes for each user
$stmt = GlobalContainer::$dbh->prepare("SELECT COUNT(*) AS `count`, user_id 
    FROM 
        changes
    GROUP BY user_id");
$stmt->execute();
while ($changes = $stmt->fetch()) {
    $users[$changes['user_id']]['changes'] = $changes['count'];
}

这非常有效,但我认为如果我把它组合成一个查询就更简洁了。这就是我所拥有的:

SELECT 
        users.id, users.username, users.realname, count(changes.user_id) as `count`
    FROM 
        users
    LEFT JOIN `changes` ON users.id = changes.user_id
    GROUP BY user_id
ORDER BY `count` ASC

但是出于某种原因,即使有几个用户,它也会跳过除了其中一个有0个更改的用户。还有几个用户每个都有3个更改,它正确显示所有这些用户。如何才能使此查询正常工作,以便向所有用户显示0更改?

3 个答案:

答案 0 :(得分:3)

看起来最近删除的答案是正确的答案。这是一个细分(和demo)。原始查询将nulls分组为单个结果。简单的答案是按非空值分组。这使得最终查询看起来像这样:

SELECT 
        `users`.id, `users`.username, `users`.realname, count(changes.user_id) as `count`
    FROM 
        `users`
    LEFT JOIN `changes` ON users.id = changes.user_id
GROUP BY `users`.id;

答案 1 :(得分:1)

将您的论坛更改为:

GROUP BY users.id

答案 2 :(得分:0)

SELECT users.id, users.username, users.realname, count(changes.user_ID) from `changes` as `count` from users
left join `changes` on users.id = changes.user_id
group by users.id;

您的计数会丢弃您的结果,您可以将其嵌套在子查询中以将其从左连接中排除,而左连接又只返回count(changes.user_id)的行并将它们组合成一个记录。如果使用子查询,则可以有效地获取changes.user_id的计数,而不会影响左连接。