我有两个表格:users
和changes
。我想跟踪每个用户所做的更改次数。目前,我做它在两个单独的语句与PHP结合:LEFT JOIN工作不正常
// 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变化?
你能发布数据吗?通过向用户显示0次更改,Didnt不明白你的意思。 – DevelopmentIsMyPassion 2013-02-19 19:28:19
如果该表中没有匹配项,则changes.user_id将返回null。有时候nulls会像COUNT()那样聚集起来。您可以尝试在COUNT()内用零替换零。 – criticalfix 2013-02-19 19:29:28
这似乎解决了它:'GROUP BY users.id'而不是'GROUP BY changes.user_id'。也许有人可以发表解释*为什么*的答案,因为我真的不知道。 – Mike 2013-02-19 19:30:48