2010-05-18 71 views
2

考虑下表:计数两次查询,一次使用限制

Table1 
[class] [child] 
math  boy1 
math  boy2 
math  boy3 
art  boy1 

Table2 
[child] [glasses] 
boy1  yes 
boy2  yes 
boy3  no 

如果我想查询每个班的孩子数,我可以这样做:

SELECT class, COUNT(child) FROM Table1 GROUP BY class 

和如果我想查询每班戴眼镜的孩子数量,我会这样做:

SELECT Table1.class, COUNT(table1.child) FROM Table1 
LEFT JOIN Table2 ON Table1.child=Table2.child 
WHERE Table2.glasses='yes' GROUP BY Table1.class 

但我真正想要做的是:

SELECT class, COUNT(child), COUNT(child wearing glasses) 

坦率地说,我不知道如何做到这一点只有一个查询。

有帮助吗?

+0

如何尝试嵌套选择? – Hanseh 2010-05-18 04:18:19

+0

我不知道如何使一个嵌套的选择符合类的要求分组。随意发布解决方案! – Drew 2010-05-18 04:25:50

+0

请发布您的正确查询结果.. – Karthik 2010-05-18 05:06:25

回答

2

你可以尝试这样的事情(不语法检查):

SELECT 
    class, 
    COUNT(distinct Table1.child), 
    SUM(IF(Table2.glasses='yes', 1, 0)) 
FROM Table1 
LEFT JOIN Table2 ON Table1.child=Table2.child 

这是一个有点哈克,你会发现这样做在两个查询它只是更容易,但这种技术在紧要关头很适合我

+0

谢谢,工作正常! – Drew 2010-05-18 05:03:09

1

在MySQL中,你可以做这样的事情:

SELECT类,COUNT(孩子),SUM(IF(眼镜= '是',1,0)

+0

按发帖顺序排序,Dan Head稍微早些时候也有同样的回应,虽然你们两人都+1 – Drew 2010-05-18 05:02:25

0

它不是一个完美的解决方案, 它是 只是一个替代的解决方案,

SELECT class AS a, COUNT(child) AS b 
FROM Table1 
GROUP BY class 
UNION ALL SELECT COUNT(table1.child) AS a, Table1.class AS b 
FROM Table1 
LEFT JOIN Table2 ON Table1.child = Table2.child 
WHERE Table2.glasses = 'yes' 
GROUP BY Table1.class 

输出是:

a b 
art  1 
math 3 
1 art 
2 math 

在这方面,我们可以得到一些想法开发出更多的东西。

0

也许该帖子是5岁,但我也是一个解决方案。

对于yes/no和true/false,使用1和0等数字对您来说更容易。

一个解决办法是(如果你改变了是的,没有的为1和0):

SELECT class,  
COUNT(distinct Table1.child) AS NumbofChilds,  
SUM(Table2.glasses) AS ChildswithGlasses 

FROM Table1 INNER JOIN Table2 ON Table1.child=Table2.child 

GROUP BY class; 

语法要进行检查,但我有我的表类似的查询和它的作品。