我有兩個表格: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