2013-02-19 2 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']; 
} 

난 그냥 하나 개의 쿼리로 결합하는 경우가 깔끔한 것 같아요. 이것은 내가 가지고있는 것입니다 :

그러나 몇 가지 이유가 있지만 몇 가지가 있지만 0이있는 사용자 중 하나만 제외하면 건너 뜁니다. 또한 각각 3 개의 변경 사항을 가진 여러 사용자가 있으며 모두 올바르게 표시하고 있습니다. 이 쿼리를 어떻게 작동 시켜서 변경 사항이 0 인 모든 사용자에게 보여줄 수 있습니까?

+0

데이터를 게시 할 수 있습니까? 사용자가 0 개의 변경 사항을 보여줌으로써 무엇을 의미하는지 이해하지 못했습니다. – DevelopmentIsMyPassion

+0

changes.user_id는 해당 테이블에 일치하는 항목이 없으면 null을 반환합니다. 때로는 널 (NULL)이 COUNT()와 같은 집계를 엉망으로 만듭니다. COUNT() 내에서 null을 0으로 바꿀 수 있습니다. – criticalfix

+0

이것으로 해결됩니다 :'GROUP BY changes.user_id' 대신에'GROUP BY users.id'. 어쩌면 누군가가 왜 * 왜 *를 설명하는 대답을 게시 할 수 있겠습니까? – Mike

답변

3

최근 삭제 된 답변이 올바른 것 같습니다. 다음은 고장입니다 (및 demo). 원래 쿼리는 nulls을 단일 결과로 그룹화했습니다. 쉬운 대답은 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; 
+0

오른쪽 조인 때문에 - 값이 변경 테이블은 null, 좋은 잡을 수 있어야합니다. – Hituptony

+0

나는 아래쪽 투표 응답을 다시 게시하여 다른 사람의 발가락을 밟지 않기를 바랍니다. –

+0

동의합니다 - 질문을 검토하기 위해 downvoted 때 내 대답을 삭제했습니다. 내가 잘못 읽은 것 같아요. – dugas

1
에 의해 그룹을 변경

에 :

GROUP BY users.id 
+0

+1 먼저 서브 쿼리가 동일한 결과를 반환하면 –

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의 수를 효과적으로 얻을 수 있습니다.

+0

을 얻었습니다. 나는 교정했다. – Hituptony

+0

이것은 실제로 각 사용자에 대해 동일한 값을 반환합니다. 모든 행의 합계와 같습니다. 귀하의 답변에 대해 – Mike

+0

주셔서 감사합니다. 나는 나의 대답을 편집했다. – Hituptony

관련 문제