У меня есть две таблицы: 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 изменениями. – DevelopmentIsMyPassion
changes.user_id вернется в нуль, если в этой таблице нет соответствующих записей. Иногда nulls испортит агрегаты, такие как COUNT(). Вы можете попробовать заменить нуль нулем внутри COUNT(). – criticalfix
Кажется, это исправить: 'GROUP BY users.id' вместо' GROUP BY changes.user_id'. Может быть, кто-то может написать ответ, объясняющий * почему *, потому что я действительно не знаю. – Mike