我想要加入2个表,到目前为止,我有一个LEFT JOIN
可以正常使用,但我希望它更具体。
现在:
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我有一个名为status
的列,我想在混合中也有这个。该列表必须包含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
答案 1 :(得分:0)
问题是您是在where
子句中过滤掉成员。要获取所有此类成员,请将条件作为条件聚合移动到select
:
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()
非常相似,只是它正在处理所有行,甚至是原始where
条件失败的行。但是,这些行的值为0
。
答案 2 :(得分:0)
在尝试所有精彩的答案时,我发现我将过滤器添加到ON线,它就像我想要的那样。你们都很棒,并且给了我很棒的办法。作为初学者,我发现这个论坛非常有用,而且大部分时间都解决了我遇到的问题。谢谢你!