2

我有 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)
4

3 回答 3

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

于 2013-06-20T00:19:55.290 回答
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
于 2013-06-19T23:25:27.930 回答
0

在尝试所有精彩的答案时,我发现我将过滤器添加到在线它就像我想要的那样工作。你们都很棒,给了我很棒的做事方式。作为一个初学者,我发现这个论坛提供了非常丰富的信息,并且大多数时候可以解决我遇到的问题。谢谢你们!

于 2013-06-24T01:29:54.643 回答