2014-06-21 7 views
0

여기서 내가 뭘 잘못하고 있니? 모든 조인 된 테이블이 올바른 세트에 조인되도록 내 FROM으로 하위 쿼리를 사용하려고합니다.subquery from the mysql

SELECT 
    active_users.username as username, 
    active_users.computer_name as computer_name, 
    alert.cnt as alerts 

    FROM 
    (SELECT 
     computer_name, 
     username 
     FROM computers 

     INNER JOIN users 
     on users.computer_id = computers.computer_id 

     WHERE computers.account_id = :cw_account_id AND computers.status = :cw_status 
    ) AS active_users 

    LEFT JOIN 
     (SELECT 
      user_id, 
      count(*) as cnt 
     from logs 
     group by user_id 
    ) AS alert 
     on alert.user_id = active_users.user_id 

답변

2

당신은 첫 번째 하위 쿼리에 user_id를 선택해야합니다

SELECT active_users.username as username, active_users.computer_name as computer_name, 
     alert.cnt as alerts 
FROM (SELECT user_id, computer_name, username 
     FROM computers INNER JOIN 
      users 
      on users.computer_id = computers.computer_id 
     WHERE computers.account_id = :cw_account_id AND computers.status = :cw_status 
    ) active_users LEFT JOIN 
     (SELECT user_id, count(*) as cnt 
     from logs 
     group by user_id 
    ) alert 
     on alert.user_id = active_users.user_id; 
+0

멋진 ... 내가 물어 있도록 이전뿐만 아니라 저를 도왔다 생각 ... 나는 가정 할 수 이러한 방식으로 그 최적화 프로그램은 하위 조인에서 결합하기 때문에 왼쪽 조인 된 테이블에서 필요한 행을 읽는 중입니까? 그것이 내 목표였습니다. – user756659

+0

그럴 수 있다고 생각하지 않습니다. 하위 쿼리에서'group by'을 사용하면 일반적으로 모든 행이 생성됩니다. –

+0

몇 가지 테스트를했는데 네, 여전히 왼쪽에 조인 된 테이블에서 모든 행을 읽습니다. 어떻게 제거하는 방법에 대한 아이디어? 테이블이 커질수록 확실히 문제가 될 것입니다. 예를 들어, alert.cnt는 50을 반환하지만 로그 테이블에서 전체 7k 행을 읽습니다. – user756659