Mysql 查询并获得三个预期结果
我的预期结果:Mysql 查询并获得三个预期结果,mysql,sql,Mysql,Sql,我的预期结果: SELECT ( `members`.`id` SELECT COUNT(`members`.`id`) FROM `members` WHERE `gender` = 0 AS `Unknown` SELECT COUNT(`members`.`id`) FROM `members` WHERE `gender` = 1 AS `Female` SELECT COUNT(`members`.`id`) FROM `members` WHERE `
SELECT
(
`members`.`id`
SELECT COUNT(`members`.`id`) FROM `members` WHERE `gender` = 0 AS `Unknown`
SELECT COUNT(`members`.`id`) FROM `members` WHERE `gender` = 1 AS `Female`
SELECT COUNT(`members`.`id`) FROM `members` WHERE `gender` = 2 AS `Male`
) FROM `members` INNER JOIN `mapMember`
ON `mapMember`.`id` = `members`.`id`
WHERE `mapMember`.`mapper_id` = 3
然而,我得到语法错误。我想不出怎么了
我还尝试:
Unknown Female Male
0 1 3
这让我几乎得到了我想要的结果,唯一的区别是如果没有具有给定性别的成员,则不会返回0结果。(就是没有行)我总是希望有三行返回。其他人给了你解决方案,所以我主要告诉你你自己的陈述哪里出了问题
SELECT COUNT(`members`.id) AS `members`, `gender`
FROM `members` INNER JOIN `mapMember`
ON `mapMember`.`id` = `members`.`id`
WHERE `mapMember`.`mapper_id` = 3 GROUP BY `gender` ORDER BY `gender` ASC
members
id
不为空,因此您只需计算来自成员的所有记录。您需要一个where子句,而不是将计数的记录限制为有问题的成员idSELECT
sum(if (`gender` = 0, 1,0)) as `Unknown`,
sum(if (`gender` = 1, 1,0)) as `Female`,
sum(if (`gender` = 2, 1,0)) as `Male`
FROM `members` INNER JOIN `mapMember`
ON `mapMember`.`id` = `members`.`id`
WHERE `mapMember`.`mapper_id` = 3
现在它的语法是正确的。但是,由于成员记录只有一个性别,因此您将始终获得0-0-1或0-1-0或1-0-0的记录。因此,您并不真的希望选择成员并拥有每个成员的计数
下面是一个更好的语句,它只查询一次表,计算所有记录而不是每个成员的记录,并通过为mapmember使用IN子句提供更好的可读性。(您还可以用EXISTS子句替换IN子句,这有时会更快。)
(顺便问一下:mapmember id真的是一个成员id吗?有一个名为id的列的表看起来很奇怪,它不是表本身的id,而是另一个表的id。)
编辑:我刚刚注意到您使用的是MySQL。在这里,您可以使用布尔数据类型:
select
sum( case when gender = 0 then 1 else 0 end ) as unknown,
sum( case when gender = 1 then 1 else 0 end ) as female,
sum( case when gender = 2 then 1 else 0 end ) as male
from members
where id in (select id from mapmember where mapper_id = 3);
这不再是标准的SQL,因为它使用了MySQL的增强功能。请在sqlfiddle.com中发布表和一些数据。您在
成员之后留下了逗号“
id
您宁愿使用UNION ALL,不只是UNION@DmitryBychenko如果SQL语法中有错误,则具有不同结果的UNION与UNION ALL是相同的,这无关紧要;查看与您的MySQL服务器版本对应的手册,了解使用near'ASUnknown
UNION的正确语法
SELECT
`members`.`id`,
(SELECT COUNT(*) FROM `members` u WHERE `gender` = 0 AND u.id = members.id) AS `Unknown`
(SELECT COUNT(*) FROM `members` f WHERE `gender` = 1 AND f.id = members.id) AS `Female`
(SELECT COUNT(*) FROM `members` m WHERE `gender` = 2 AND m.id = members.id) AS `Male`
FROM `members` INNER JOIN `mapMember`
ON `mapMember`.`id` = `members`.`id`
WHERE `mapMember`.`mapper_id` = 3;
select
sum( case when gender = 0 then 1 else 0 end ) as unknown,
sum( case when gender = 1 then 1 else 0 end ) as female,
sum( case when gender = 2 then 1 else 0 end ) as male
from members
where id in (select id from mapmember where mapper_id = 3);
select
sum( gender = 0 ) as unknown, sum( gender = 1 ) as female, sum( gender = 2 ) as male
from members
where id in (select id from mapmember where mapper_id = 3);