【问题标题】:MySQL Conditional SELECT in SELECTSELECT 中的 MySQL 条件 SELECT
【发布时间】:2019-12-08 21:04:17
【问题描述】:

表:

id    price    is_active
========================
1     20.99    0
2     10.99    1
3     30.99    0
4     15.99    1
5     35.99    1

我正在尝试从 is_active 等于 1 的所有行中选择 COUNT,所以我使用了这个简单的查询:

SELECT COUNT(*) FROM table WHERE is_active=1

但是如果我还想知道有多少行有价格:

  • 小于 15
  • 15 到 30 之间
  • 30多个

我可以这样写:

SELECT COUNT(*) FROM table WHERE is_active=1 AND price < 15
SELECT COUNT(*) FROM table WHERE is_active=1 AND price > 15 AND price < 30
SELECT COUNT(*) FROM table WHERE is_active=1 AND price > 30

但是我可以在一个返回类似内容的简单查询中完成吗?

"Less than 15" | "Between 15 and 30" | "More than 30"
1              | 2                   | 2

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    使用条件聚合:

    SELECT 
      SUM(price < 15) `Less than 15`,
      SUM(price >= 15 AND price <= 30) `Between 15 and 30`,
      SUM(price > 30) `More than 30`
    FROM `table` 
    WHERE is_active=1
    

    在 MySql 中,像 price &lt; 15 这样的布尔表达式被评估为 0 用于 false1 用于 true
    请参阅demo
    结果:

    | Less than 15 | Between 15 and 30 | More than 30 |
    | ------------ | ----------------- | ------------ |
    | 1            | 1                 | 1            |
    

    【讨论】:

      【解决方案2】:

      因为它们是均匀的间隔,你可以

      SELECT
         IF(price > 30, 30, price) div 15 as g,
         count(*) as c
      FROM `table`
      WHERE is_active=1
      GROUP BY g
      

      请注意,这会将 30 留在“超过 30”类别中

      【讨论】:

        猜你喜欢
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 2013-09-21
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多