2016-03-28 62 views
0

是否有办法从子查询中的选定项再次过滤?在子查询中再次过滤

例如:我已经过滤的用户从一个公司:

SELECT * FROM user WHERE companyId = 123 

现在我要过滤的女性,男性和今年从公司上述创建的用户一般。目前我使用此查询:

SELECT 
    (SELECT COUNT(id) FROM user WHERE companyId = 123 && sex = "male") maleUser, 
    (SELECT COUNT(id) FROM user WHERE companyId = 123 && sex = "female") femaleUser, 
    (SELECT COUNT(id) FROM user WHERE companyId = 123 && YEAR(created) = YEAR(NOW())) currentYearUser 

但我想,使其更容易,如:

SELECT 
    (SELECT COUNT(id) FROM userAlreadyFilteredByCompany WHERE sex = "male") maleUser, 
    (SELECT COUNT(id) FROM userAlreadyFilteredByCompany WHERE sex = "female") femaleUser, 
    (SELECT COUNT(id) FROM userAlreadyFilteredByCompany WHERE YEAR(created) = YEAR(NOW())) currentYearUser 

FROM 
    (SELECT id, created FROM user WHERE companyId = 123) userAlreadyFilteredByCompany 

有没有办法做到这一点?我认为在选择已经过滤的结果时,它更易于理解,并且工作量更低。

回答

1
SELECT 
    SUM(CASE WHEN sex = "male" THEN 1 ELSE 0 END) as maleUser, 
    SUM(CASE WHEN sex = "female" THEN 1 ELSE 0 END) as femaleUser, 
    SUM(CASE WHEN YEAR(created) = YEAR(NOW()) THEN 1 ELSE 0 END) as currentYearUser 

FROM user 
WHERE companyId = 123 

您可以使用CASE/WHEN加入您的情况,总结了数字

+0

或者,如它是MySQL,只是'SUM(sex ='male')' – Strawberry

0

试试这个:

SELECT 
    SUM(sex = "male") maleUser, 
    SUM(sex = "female") femaleUser, 
    SUM(YEAR(created) = YEAR(NOW())) currentYearUser 
FROM user WHERE companyId = 123 
0

嘿,你可以尝试这样的:

SELECT 
    COUNT(if(sex = "male", 1, NULL) as maleUser, 
    COUNT(if(sex = "female", 1, NULL) as femaleUser, 
    COUNT(if(YEAR(created) = YEAR(NOW())), 1, NULL) as currentYearUser 
FROM user 
WHERE companyID = 123