LEFT JOIN 2表

时间:2013-06-19 23:09:04

标签: mysql

我想要加入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)

3 个答案:

答案 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线,它就像我想要的那样。你们都很棒,并且给了我很棒的办法。作为初学者,我发现这个论坛非常有用,而且大部分时间都解决了我遇到的问题。谢谢你!