MySQL根据3个不同的标准计算单行

时间:2015-05-19 10:28:23

标签: mysql optimization

我想基于mySQL查询返回一个关联数组,以便查询产生3列,这些列是3种不同方式的单个数据集的计数。我最好的解决方案有点不合理,我希望有更好的方法,因为下面没有显示一些不相关的复杂性。具体来说,我有一个用户表,其中包含用户编号,性别和地点 - 这个地方是动态变量,需要稍后绑定到查询中(在这个例子中,我正在寻找地点= 1)。基本表如下所示:

user gender  place
1      m       1
2      m       2
3      f       1
4      m       1
5      f       2

我希望在第1位返回3列总数,男性总数,女性总数。

我的第一次尝试返回具有正确值的3行,但因为它们是行,所以我无法使用关联数组干净地访问它们:

SELECT COUNT(DISTINCT user) as total FROM users WHERE place=1
UNION ALL 
SELECT COUNT(DISTINCT id_customer) as male FROM users
    WHERE gender = 'm' AND place=1
UNION ALL
SELECT COUNT(DISTINCT id_customer) as female FROM users
    WHERE gender = 'f' AND place=1

我的第二次尝试给了我正确的结果,但似乎有点冗长,因为我必须将地方变量绑定3次 - 有更好的方法吗?

SELECT total, male, female FROM
  (SELECT COUNT(DISTINCT user) as total FROM users
        WHERE place=1
        ) as total
INNER JOIN
  (SELECT COUNT(DISTINCT user) as male  FROM users
        WHERE place=1 AND gender='m') as male
INNER JOIN
 (SELECT COUNT(DISTINCT user) as female  FROM users
        WHERE place=1 AND gender='f') as female

1 个答案:

答案 0 :(得分:2)

你需要DISTINCT部分吗?或“用户”字段是唯一的(主键或其他)?

我在http://sqlfiddle.com/#!9/928fa/7

中准备了两个版本

如果用户是唯一的,那么这应该足够了:

SELECT count(1), sum(gender='m'), sum(gender='f')
FROM users
WHERE place=1;