社区服务表
|student name (id in real table)|hours|year|event name (id in real table)|
|Johnny Smith | 5|2010|Beach Clean-up |
|Samantha Bee | 3|2011|Daily Show Volunteering |
|Samantha Bee | 2|2011|Daily Show Bake Sale |
|Bilbo Baggins | 10|2011|The Shire Feast Setup |
从这张表中我想得到以下输出:
2011年的小时数:
Johnny Smith: 0 (his hours are in 2010)
Samantha Bee: 5
Bilbo Baggins: 10
这是我失败的尝试:
mysql_query("select name,
sum(hours)
from community_service
where year = '2011'
or year is null
group by name");
我理解为什么'年份为空'不能给我我想要的东西,我只是不知道如何正确地做到这一点。
提前致谢!
由于我的简单查询似乎让人感到困惑,所以这是整个辣酱玉米饼馅:
SELECT DISTINCT contacts.contactID,
sum(hours) as hours,
contacts.first,
contacts.last,
contacts.graduates
from contacts
left join comm_stud using (contactID)
left join comm_svc using (csID)
left join tbl_yeardiv on comm_svc.termID = tbl_yeardiv.yeardivID
WHERE (year = '2010-11')
group by contacts.contactID
tbl_yeardiv包含秋季和春季学期等学期。 comm_stud将学生加入每个comm_svc事件。
答案 0 :(得分:1)
你不想group by name
吗?
如果您想要显示零值,请将表连接到自身:
SELECT a.name, sum(b.hours)
from community_service a
LEFT OUTER JOIN
community_service b
on a.name = b.name
WHERE b.year = 2011
GROUP BY a.name
如果在您的实际应用程序中有多个表,则只需LEFT OUTER JOIN
对ID-HOUR-YEAR表使用即可。
答案 1 :(得分:0)
尝试isnull(years)
。另外,如果每个学生和每年没有多个条目,则不需要sum
(如果这样做,如果您sum
,则只能明智地使用group by name, year
) 。最后,为什么一年是一个字符串,即你为什么要在它周围放置撇号?
如果这些都没有帮助,请更新您的帖子,说明究竟什么不起作用。
答案 2 :(得分:0)
您不需要sum(hours)
,hours
也没关系。
select name,
hours
from community_service
where year = '2011'
答案 3 :(得分:0)
解决方案实际上非常简单。它涉及向ON子句添加条件。从: http://opensourceanalytics.com/2006/07/29/advanced-mysql-join-tips-tricks/
现在假设您不想从整个table2中搜索,而是从table2的子集中搜索(比如CityID = 1)。你是怎样做的?您可以尝试自己查看以下SQL不是解决方案:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL
and table2.CityID = 1
请注意,这是因为我们正在查找table2中不存在的记录,因此不能在table2数据上使用where子句。
进一步阅读手册页,另一位用户评论指出:
Conditions for the “right table” go in the ON clause.
Conditions for the “left table” go in the WHERE clause,
except for the joining conditions themselves.
这使解决方案成为:
SELECT table1.* FROM table1 LEFT JOIN table2 ON (table1.id=table2.id and table2.CityID = 1)
WHERE table2.id IS NULL
因此,我原始查询的解决方案如下所示:(经过测试的工作查询)
SELECT DISTINCT contacts.contactID,
sum(hours) as hours,
contacts.first,
contacts.last,
contacts.graduates from contacts
left join comm_stud using (contactID)
left join comm_svc using (csID)
(这是秘密酱:)。
left join tbl_yeardiv on (comm_svc.termID = tbl_yeardiv.yeardivID && year = '".thisyear()."')
left join group_members on contacts.contactID = group_members.contactID
left join groups using (groupID)
WHERE groups.name = 'Students'
and group_members.status like '%Matriculated%'
group by contacts.contactID
感谢大家的帮助。我希望我发现的内容可以帮助您更轻松地编写查询。