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
  • COUNT(column_name)只对column_name不为null的记录进行计数
    members
    id
    不为空,因此您只需计算来自成员的所有记录。您需要一个where子句,而不是将计数的记录限制为有问题的成员id
  • 子查询必须在括号中
  • 这是你重新写的声明。但这并不好,因为您一次又一次地查询同一个表。我只想使用您的声明,只更正错误:

    SELECT
      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'AS
    Unknown
    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);