【问题标题】:mysql get total values and total number from where clausemysql从where子句中获取总值和总数
【发布时间】:2017-05-16 15:58:49
【问题描述】:

我正在尝试编写一个 mysql 查询,它将返回列中的值总数以及基于同一列中的 where 子句的值总数。

我有一张这样的桌子:

+------------------------+-------+
| color                  | code  |
+------------------------+-------+
| red                    |   200 |
| red                    |   202 |
| blue                   |   105 |
| yellow                 |   136 |
| green                  |   561 |
| red                    |   198 |
| blue                   |   414 |
| green                  |   11  |
| yellow                 |   600 |
| green                  |   155 |
| red                    |   865 |
| blue                   |   601 |
| green                  |   311 |
+------------------------+-------+

如果我运行这个查询:

select 
    color, 
    count(*) as count 
from colors 
where code > 0 && 
    code <= 500 
group by color 
order by count(*) desc;

我得到了这个很棒的结果,因为它几乎就是我想要的:

+------------------------+-------+
| color                  | count |
+------------------------+-------+
| red                    |     3 |
| green                  |     3 |
| blue                   |     2 |
| yellow                 |     1 |
+------------------------+-------+

我还需要返回列中值的总数,所以结果表应该是这样的。

+------------------------+--------------+-------+
| color                  | total        | count |
+------------------------+--------------+-------+
| red                    |            4 |     3 |
| green                  |            4 |     3 |
| blue                   |            3 |     2 |
| yellow                 |            2 |     1 |
+------------------------+--------------+-------+

所以total是color列中每个值的个数,count是匹配where子句的总数。

谢谢:)

这里是 SQLFiddle 的链接。

http://sqlfiddle.com/#!9/777f93/2

【问题讨论】:

  • 将 where 子句移动到 case 语句中进行计数,然后加上一个总和就完成了。
  • 另外,SQL 使用 AND 而不是 &&
  • @Sloan Thrasher,根据 mysql 文档,AND 和 && 都是正确的。与 || 相同和或。 dev.mysql.com/doc/refman/5.7/en/logical-operators.html

标签: mysql


【解决方案1】:

您需要使用条件聚合来处理计数并让引擎处理总数。

SELECT color
     , count(*) as Total
     , sum(case when code > 0 and code <= 500  then 1 else 0 end) as cnt 
FROM  colors 
GROUP BY color 
ORDER BY cnt desc;

【讨论】:

  • 感谢 xQbert,它有效。我会接受你的答案是正确的,因为虽然其他答案也有效,但你首先回答了。
【解决方案2】:

您可以使用条件聚合:

select color,
    count(*) as Total,
    sum(code > 0 and code <= 500) as count_0_to_500
from colors
group by color
order by count_0_to_500 desc

它使用了在 MySQL 中 true 评估为 1 而 false 评估为 0 的事实。

这基本上是 xQbert 回答的内容,只是没有案例表达式。

【讨论】:

  • 是的,我尽可能多地尝试做与 db 无关的事情。但有时这会影响性能。
【解决方案3】:

您可以JOIN您的查询与另一个查询,例如:

select color, count(*) as count , a.total
from colors JOIN (
    SELECT color, count(*) as `total` FROM colors GROUP BY color 
 ) a ON colors.code = a.color
where code > 0 && code <= 500 
group by color 
order by count(*) desc;

【讨论】:

    【解决方案4】:

    您使用 case when 语句仅计算符合您条件的项目。像这样:

    Select 
    color
    , count(*) as total
    , SUM(CASE WHEN code > 0 && code <= 500 THEN 1 ELSE 0 END ) as Count
    group by color order by count(*) desc;
    

    【讨论】:

      【解决方案5】:

      您可以使用连接查询和表别名来做到这一点

          select t1.color,t1.total,t2.count 
      FROM 
      (select color, count(*) as total from colors group by color) t1,
      (select color, count(*) as `count` from colors where `code` > 0 && `code` <= 500 group by color) t2
      WHERE
      t1.color=t2.color order by `count` desc;
      

      这里是 SQLFiddle 的链接。

      http://sqlfiddle.com/#!9/777f93/2

      【讨论】:

        猜你喜欢
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多