2012-01-31 3 views
10

세 개의 테이블이 있는데 테이블 중 하나에서 모든 데이터를 선택하고 특정 데이터 행이 연결된 횟수를 COUNT 다른 두 테이블.LEFT JOIN 내에서 두 테이블의 여러 COUNT() LEFT JOIN 내에서

그래서 site_projects의 모든 데이터를 선택하십시오. 그런 다음 site_project_members WHITE site_projects의 COUNT 개를 반환하십시오. id = site_project_members. pid 그리고 site_project_tasks WHERE site_projects의 COUNT 개를 반환합니다. id = site_project_members. pid

나는이 질문에 의미가 있다고 생각한다. 그리고 문제없이 데이터베이스 (MySQL)를 쿼리합니다. 을 제외하고 두 가지 모두의 합계를 두 가지로 반환합니다.

,428,952,321 :

site_projects

id | title  | desc  | start  | deadline | progress 

1 | Project 1 | a project | 1321748906 | 1329847200 | 20 

site_project_members

id | pid | uid | img | hidden 
1 | 1 | 1 | 1 | 0 
2 | 1 | 2 | 2 | 0 

site_project_tasks 여기

id | pid | desc | completed 
1 | 1 | Task 1 | 1 
1 | 1 | Task 2 | 0 

(테이블 구조 아래 참조) 내 쿼리입니다 0

내가 얻는 결과는 다음과 같습니다

id | title  | desc  | progress | start  | deadline | members | tasks 
1 | Project 1 | a project | 20  | 1321748906 | 1329847200 | 4  | 4 

은 "4"의 값 모두가되지 않습니다 그러나 2 있어야한다 : 수 S 누군가가 도움을? 많은 감사

감사합니다, 댄 정말 트릭을 할해야

+0

잘못된 집계 때문입니다! MySQL은 다른 RDBMS와는 달리 집계를 중지하지 않습니다. 근본적으로 당신은'GROUP BY'를 지정하지 않았기 때문에 무작위 값을 돌려받습니다. – JNK

답변

21
SELECT p.id , p.title , p.desc , p.progress , p.start , p.deadline , 
    COALESCE(m.cnt, 0) AS members, 
    COALESCE(t.cnt, 0) AS tasks 
FROM site_projects p 
LEFT JOIN 
    (SELECT pid, COUNT(*) AS cnt FROM 
    site_project_members 
    GROUP BY pid) m 
ON p.id = m.pid 
LEFT JOIN 
    (SELECT pid, COUNT(*) AS cnt FROM 
    site_project_tasks 
    GROUP BY pid) t 
ON p.id = t.pid 
ORDER BY p.id ASC 
+0

치료를해라! : D 대단히 감사합니다 :) –

+0

고마워, 내 쿼리에 나를 구해 줬어. COALESCE (comments.total, 0) AS comments,'user'. *,'company'.name FROM'user' (좋아요, likes.total, 0) AS는 게시물을 COALESCE (posts.total, INNER JOIN'company' ON user.company_id = company.idINNER JOIN (사용자 ID 선택, 총 피드 수 GROUP BY user_id) POST.user_id = user.id에 게시 됨 INNER JOIN (SELECT user_id (*) GROUP BY user_id)에 대한 주석 (GROUP BY user_id)의 합계를 카운트 (*) 합계 likes.user_id를 좋아하는 ON_ERROR.user_id = user.id INNER JOIN = user.id; –

3
SELECT p.`id`, p.`title`, p.`desc`, p.`progress`, p.`start`, p.`deadline`, 
    (SELECT COUNT(*) FROM site_project_members m WHERE p.`id`=m.`pid`) AS `members`, 
    (SELECT COUNT(*) FROM site_project_tasks t WHERE p.`id`=t.`pid`) AS `tasks` 
FROM `site_projects` p 
ORDER BY p.`id` ASC 

.

+0

답변을 주셔서 감사합니다. 그러나 여전히 동일한 결과를 제공합니다. S –

+0

흠, 문제는 바깥 쪽 조인 안에 있습니다 ... 다시 디자인하는 방법을 생각해 봅시다. – dgw

+0

@DanSpiteri Ok, 재 설계가 완료되었습니다. – dgw