Mysql查询帮助where子句

时间:2010-08-26 17:38:36

标签: sql mysql where-clause

社区服务表

|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事件。

4 个答案:

答案 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 

感谢大家的帮助。我希望我发现的内容可以帮助您更轻松地编写查询。