2013-07-17 1 views
0

조인을 사용하여 하나의 SQL 문으로 2 개의 테이블에서 데이터를 가져 오려고합니다. 아이디어는 아주 간단합니다. 프로젝트에는 참가자가 있으며, 프로젝트 개요에는 참가자의 수와 함께 프로젝트 정보가 표시됩니다.LEFT OUTER JOIN이 모든 행을 표시하지 않습니까?

지금은 참여자가있는 프로젝트와 참여자가없는 다른 프로젝트가 2 개 있습니다.

SELECT SQL_CALC_FOUND_ROWS `p`.`id`, 
     `p`.`title`, 
     `p`.`live`, 
     `p`.`startDate`, 
     `p`.`endDate`, 
     COUNT(`part`.`id`) AS `participants` 
FROM `projects` `p` 
LEFT OUTER JOIN `participants` `part` 
    ON `p`.`id` = `part`.`projectid` 
ORDER BY `p`.`live` DESC, 
     `p`.`startDate` DESC 
LIMIT 0,10 

문제이며,이 쿼리는 참가자들과 프로젝트를 반환하고 참가자없이 하나가 탈락되어

나는이 쿼리를 사용합니다.

내가 뭘 잘못하고 있니?

답변

5

당신은 여기 GROUP BY

SELECT SQL_CALC_FOUND_ROWS `p`.`id`, 
     `p`.`title`, 
     `p`.`live`, 
     `p`.`startDate`, 
     `p`.`endDate`, 
     COUNT(`part`.`id`) AS `participants` 
FROM `projects` `p` 
LEFT OUTER JOIN `participants` `part` 
    ON `p`.`id` = `part`.`projectid` 
GROUP BY `p`.`id`, 
     `p`.`title`, 
     `p`.`live`, 
     `p`.`startDate`, 
     `p`.`endDate` 
ORDER BY `p`.`live` DESC, 
     `p`.`startDate` DESC 
LIMIT 0,10 

SQLFiddle 데모

+0

이것은 효과가 있습니다! 감사! 이유를 설명해 주시겠습니까? 나는 이제 그것이 작품이라는 것을 알고 있지만 실제로 작동하는 이유는 모르겠다. – SheperdOfFire

+1

집계 함수'COUNT()'를 적용하고 단일 값이 아닌 그룹 당 결과를 얻고 싶다면 (프로젝트 당 경우) 결과를 얻기를 원하기 때문에'GROUP BY'를 사용해야합니다. – peterm

+0

저는 실제로 꽤 흥미 롭습니다. 상관 관계가있는 하위 쿼리와 비교하여이 모양의 성능이 어떻습니까? 비슷한 지 아니면 잠재적으로 더 효율적일까요? – Kaiwa

3

이 작업은 JOIN으로 수행하지 말고 상관 하위 쿼리로 수행해야한다고 생각하지 않습니다.

SELECT SQL_CALC_FOUND_ROWS `p`.`id`, 
    `p`.`title`, 
    `p`.`live`, 
    `p`.`startDate`, 
    `p`.`endDate`, 
    (SELECT COUNT(`part`.`id`) FROM `participants` `part` WHERE `part`.`projectid` = `p`.`id`) AS `participants` 
FROM `projects` `p` 
ORDER BY `p`.`live` DESC, 
    `p`.`startDate` DESC 
LIMIT 0,10 
+0

하지만이에 따라입니다 사용해야합니다 : http://www.codinghorror.com/blog/2007/10/a -visual-explanation-of-sql-joins.html 조인을 사용하여 수행 할 수 있어야하며 일부 레코드에는 null 또는 이와 유사한 것이 포함되어야합니다. 하위 쿼리를 사용하여 수행 할 수 있음을 알고 있지만 생각했던 것처럼 좋지 않습니다. – SheperdOfFire

+0

그럼 당신은 그의 해결책을 peterm 봐야 할 것입니다. 이 두 쿼리는 모두 같은 결과를 제공합니다. – Kaiwa