2013-04-05 85 views
2

我有两个表:邀请和事件。我需要做一个子查询

我需要获取事件的名称,每个事件的客人总数和呈现的总数,当其每个事件在同一个查询中为真时!

喜欢的东西加入两个表(左连接)选择events.name,计数(invitations.guest),计数(invitations.presents时= TRUE)和事件组吧...

展望表中的数据...

https://dl.dropbox.com/u/360112/Duda/invitaciones.jpg https://dl.dropbox.com/u/360112/Duda/eventos.jpg

我认为它可以工作,但我没有得到我想要的东西......

SELECT e.name, count(in.guest) as Guests, (SELECT count(presents) 
FROM watermelon.invitations WHERE presents = true) as Presents 
FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event 
GROUP BY in.event; 

然后我得到:

http://dl.dropbox.com/u/360112/Duda/resultado.jpg

一些建议吗?请我需要它,我厌倦了尝试和得到错误的结果... 在此先感谢!

+0

请格式化的问题更好的下一次。 :)此外,您的投递箱的链接已损坏。 – Jess 2013-04-05 03:27:38

+1

哦!下次我会知道的! – Jamr 2013-04-05 04:24:39

回答

2

听起来像是你想要的东西,这样的使用COUNTGROUP BYCASE

SELECT E.Id, 
    E.Name, 
    COUNT(I.Id) TotalGuests, 
    COUNT(CASE WHEN I.Presents = 'TRUE' THEN 1 END) TotalPresents 
FROM Events E 
    LEFT JOIN Invitations I ON E.Id = I.Event 
GROUP BY E.Id, E.Name 

我不看好礼物的数据类型,但是这应该是接近。还使用LEFT JOIN返回所有事件。

+0

谢谢。它完美的工作!请问,你能告诉我在哪里可以找到关于在查询中使用的方法和关键字的更多信息? – Jamr 2013-04-05 04:21:00

+1

@Jamr - np,很高兴我们能帮上忙! CASE语句与IF语句非常相似 - 如果Presents ='True'则对该记录进行计数,否则不要(实际上返回null,如果您尝试计数为null,则计为0)。您可以将多个WHEN语句串联在一起(否则如果),这可以实现更好的比较。最好的祝福。 – sgeddes 2013-04-05 04:27:26

1

的问题是,你的子查询
(SELECT count(presents) FROM watermelon.invitations WHERE presents = true)
没有做任何过滤;它只是在每次被调用时计算表中的所有记录。以下查询应按照您的需要进行。这是你有,只是我添加了“和subq.event = e.id”的标准,这限制了子查询的数据仅为特定记录完全相同的查询:
SELECT e.name, count(in.guest) as Guests, (SELECT count(subq.presents) FROM watermelon.invitations as subq WHERE subq.presents = true and subq.event=e.id) as Presents FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event GROUP BY in.event;