我有两个表:users
和changes
。我想跟踪每个用户所做的更改次数。目前我在两个单独的语句中与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更改?
答案 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的计数,而不会影响左连接。