0

我有两张桌子: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 的用户?

4

3 回答 3

3

好吧,看起来最近删除的答案是正确的。这是一个细分(和一个演示)。原始查询将 分组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;
于 2013-02-19T19:42:41.933 回答
1

将您的组更改为:

GROUP BY users.id
于 2013-02-19T19:32:49.650 回答
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 的计数,而不会影响您的左连接。

于 2013-02-19T19:33:32.260 回答