2013-02-19 151 views
0

我有兩個表格:userschanges。我想跟蹤每個用戶所做的更改次數。目前,我做它在兩個單獨的語句與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

你能發佈數據嗎?通過向用戶顯示0次更改,Didnt不明白你的意思。 – DevelopmentIsMyPassion 2013-02-19 19:28:19

+0

如果該表中沒有匹配項,則changes.user_id將返回null。有時候nulls會像COUNT()那樣聚集起來。您可以嘗試在COUNT()內用零替換零。 – criticalfix 2013-02-19 19:29:28

+0

這似乎解決了它:'GROUP BY users.id'而不是'GROUP BY changes.user_id'。也許有人可以發表解釋*爲什麼*的答案,因爲我真的不知道。 – Mike 2013-02-19 19:30:48

回答

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; 
+0

由於左連接的變化 - 值更改表可以爲空,好的捕獲。 – Hituptony 2013-02-19 19:43:36

+0

我希望我沒有踏上任何人的腳趾重新發布投票回答 – 2013-02-19 19:43:43

+0

我同意 - 刪除我的答案,當它downvoted審查的問題,因爲我想我可能會誤讀它.. – dugas 2013-02-19 19:45:15

1

通過更改組:

GROUP BY users.id 
+0

+1你有它第一次:) – 2013-02-19 19:45:49

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; 

你計數擺脫你的結果,你可以窩在一個子查詢從您的左連接,而這又只能返回行排除計數(changes.user_id)並將它們組合成一條記錄。如果使用子查詢,則可以在不影響左連接的情況下有效獲取changes.user_id的數量。

+0

如果你發現子查詢返回相同的結果。我立場糾正。 – Hituptony 2013-02-19 19:38:18

+0

這實際上爲每個用戶返回相同的值。看起來像所有行中的總數。 – Mike 2013-02-19 19:41:40

+0

感謝您的回覆。我編輯了我的答案。 – Hituptony 2013-02-19 19:42:59