0

私は2つのテーブルを持っています:userschanges。各ユーザーが行った変更の数を追跡したいと思います。現在、PHPと組み合わせた2つの別々のステートメントでそれを行っています。

// 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'];
}

これは完璧に機能しますが、1つのクエリにまとめた方がいいと思います。これは私が持っているものです:

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のユーザーの1つを除いて、複数のユーザーがスキップされています。また、それぞれ3つの変更があり、すべてが正しく表示されているユーザーもいます。このクエリを機能させて、変更が0のすべてのユーザーを表示するにはどうすればよいですか?

4

3 に答える 3

3

最近削除された回答が正解だったようです。これが内訳(およびデモ)です。元のクエリは、nullsを1つの結果にグループ化することでした。簡単な答えは、nullではない値でグループ化することです。これにより、最終的なクエリは次のようになります。

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)の行のみが返され、それらが1つのレコードに結合されます。サブクエリを使用すると、左結合に影響を与えることなく、changes.user_idのカウントを効果的に取得できます。

于 2013-02-19T19:33:32.260 に答える