【问题标题】:Counting occurance of a value in SQL results set in PHP计算PHP中SQL结果集中值的出现次数
【发布时间】:2012-08-06 09:40:33
【问题描述】:

假设我有一张名字姓氏性别国籍等的人的表格。

我要统计男性人数和女性人数。

我可以做两条 SQL:

SELECT COUNT(id) FROM people WHERE sex = 'male'
SELECT COUNT(id) FROM people WHERE sex = 'female'

但是我可以做一个查询:

SELECT * FROM people

然后数一下“男”和“女”出现的次数? 循环遍历整个结果集是唯一的方法吗?

编辑:我问这个的原因是因为性能。我将有多个 JOIN 并且表大小超过 2k 行。而且,我不会只统计性别,还会统计国籍、年龄、语言等很多栏目。

我只是想确保我选择的方法将使用最少的资源。我不希望查询和 PHP 脚本需要很长时间才能运行。

谢谢。

【问题讨论】:

    标签: php mysql resultset


    【解决方案1】:

    您可以通过将sex 列分组并使用COUNT( ) 函数聚合其他列来做到这一点。

    SELECT   sex, 
             COUNT(*) GenderCount
    FROM     people
    GROUP BY sex
    

    PS:请将您的专栏名称更改为 Gender 而不是 sex.. 呵呵

    Some Additional Information for Aggregate FunctionsHERE

    【讨论】:

    • 如果我要计算 10 件事,包括性别,那么将上述查询分别运行 10 次是否明智?我有多个 JOIN,所以我担心性能。
    • 否,但您仍然可以在单个查询中执行此操作,例如:SELECT COUNT(sex), COUNT(GENDER)....,具体取决于您的需要。
    【解决方案2】:

    要在一行中获得输出,您可以试试这个:

    SELECT SUM(IF(sex = 'male', 1, 0)) AS male_count,
           SUM(IF(sex = 'female', 1, 0)) AS fe_male_count
    FROM people;
    

    要获得多行输出试试这个:

    SELECT sex, COUNT(1) AS cnt
    FROM people
    GROUP BY sex;
    

    不过我认为GROUP BY 查询会更快。

    【讨论】:

      【解决方案3】:
      select SUM(sex='male') AS countmale, SUM(sex='female') AS countfemale from people
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多