2013-06-19 2 views
2

나는 2 개의 테이블을 가지고 있는데, 지금까지 나는 LEFT JOIN을 가지고있다. 그러나 나는 더 구체적으로하고 싶다.LEFT JOIN 2 테이블

가 지금처럼 : 나는 또한 믹스의 것을 갖고 싶어, 열이 status 이름이

SELECT m.fname, m.lname, m.position, COUNT(d.mId) AS shifts 
FROM members AS m 
LEFT JOIN duty_sched AS d 
ON d.mId = m.id AND month(d.shift_date) = $month 
WHERE m.active_mbr = '1' AND m.fname != 'memorial' 
GROUP BY m.id 
ORDER BY m.lname, m.fname 

D 내부. 이 목록에는 교대 횟수가 duty_sched 인 회원의 모든 사람들이 포함되어야합니다.

예 :

Name (Count) 

John (1) 
Mary (0) 
Mark (2) 

답변

0

내가 원했던 것처럼 온라인 라인에 필터를 추가했다는 것을 발견 한 멋진 답변을 모두 시도하는 동안. 당신은 모든 위대하고 일을 할 수있는 멋진 방법을주었습니다. 초보자 인 나는이 포럼이 매우 유익하고 대부분의 경우 내가 겪고있는 문제를 해결할 수 있음을 발견했다. 고마워요!

0

시도 :

SELECT m.fname, m.lname, m.position, COUNT(d.mId) AS shifts FROM 
members as m 
LEFT JOIN duty_sched AS d 
ON d.mId = m.id AND month(d.shift_date) = $month 
WHERE m.active_mbr = '1' AND m.fname != 'memorial' 
GROUP BY m.id 
HAVING COUNT(d.mId)>0 
ORDER BY m.lname, m.fname 
+0

시도했는데 count = 0 인 경우 이름이 표시되지 않습니다. 할당 된 교대를 가진 사람들 만 목록에 표시됩니다. –

0

문제는 당신이 where 절에서 멤버를 필터링한다는 것이다. 이러한 모든 회원을 얻으려면, 조건부 집계로 select에 조건을 이동 : 그것은 모든 행, 원래 where 조건을 실패에도 행을 처리하는 것을 제외하고

SELECT m.fname, m.lname, m.position, 
     sum(case when m.active_mbr = '1' AND m.fname != 'memorial' then 1 else 0 end) AS shifts 
FROM members AS m 
LEFT JOIN duty_sched AS d 
ON d.mId = m.id AND month(d.shift_date) = $month 
GROUP BY m.id 
ORDER BY m.lname, m.fname 

sum(case . . .)count() 매우 유사하다. 그러나 해당 행의 값은 0입니다.