【问题标题】:MySQL - Conditional SELECT to output separate columnsMySQL - 条件选择以输出单独的列
【发布时间】:2015-05-19 12:16:35
【问题描述】:

我试图解决 MySQL 中一个明显简单的问题:我有一个由 3 个字段组成的表,我想形成一个查询,该查询返回一个选择为 DISTINCT 的字段和另外两个返回剩余 COUNT 的列满足特定条件时的两个字段。

为了说明(从左到右分别命名为firstsecondthird的列):

| VzokAAD | aaa | 0 |
| VziAAAT | bbb | 0 |
| VziAAAT | ccc | 1 |
| VziAAAT | ddd | 0 |
| W0cZAAT | eee | 1 |
| VziNAAT | fff | 1 |
| VzpqAAD | ggg | 1 |
| VzpqAAD | hhh | 1 |

我当前的查询结构如下:

SELECT DISTINCT(first) AS field_one, COUNT(second) 
FROM table WHERE third = 0 GROUP BY field_one;

所以上面的查询会返回:

 | VzokAAD | 1 |
 | VziAAAT | 2 |

我可以把查询改成这样:

SELECT DISTINCT(first) AS field_one, COUNT(second) 
FROM table WHERE third = 1 GROUP BY field_one;

它会返回:

 | VzpqAAD | 2 |
 | VziNAAT | 1 |
 | W0cZAAT | 1 |
 | VziAAAT | 1 |

如何将两个查询组合在一起,以便获得第一列 GROUPED 和 DISTINCT 以及另外两列,其 COUNT 分别为第三 =1 和第三 =0。

基本上是这样的(当然是错误的):

SELECT DISTINCT(first) AS field_one, COUNT(second WHERE third = 1) 
AS alpha, COUNT(second WHERE third = 0) AS beta FROM table GROUP BY field_one;

我尝试使用 CASE 和 IF 控制流函数,但我只设法获得在单个列中定义的结果。

感谢任何愿意伸出援手的人!

【问题讨论】:

    标签: mysql sql database conditional-statements


    【解决方案1】:

    你可以简单地使用这个查询:

     select first , SUM(IF(third=0,1,0)) as Col_zero, SUM(IF(third=1,1,0)) as Col_one
     from table
     group by first;
    

    【讨论】:

    • 绝对棒极了 - 立即按我的意愿工作!谢谢Sugar Joon!
    【解决方案2】:

    您可以在下面使用UNION

    SELECT first AS field_one, 
           COUNT(second) 
    FROM table 
    WHERE third = 0 
    GROUP BY field_one;
    UNION
    SELECT first AS field_one, 
           COUNT(second) 
    FROM table 
    WHERE third = 1 
    GROUP BY field_one;
    

    还有IN呢?

    SELECT DISTINCT(first) AS field_one, 
           COUNT(second) 
    FROM table 
    WHERE third IN(0, 1) 
    GROUP BY field_one;
    

    【讨论】:

    • DISTINCT 不是函数
    • UNION 的问题在于它将所有输出合并到一列:(
    【解决方案3】:

    你可以这样做:

    SELECT 
          first AS field_one, 
          (CASE WHEN third =0 THEN COUNT(second) END)AS count1, 
          (CASE WHEN third=1 THEN COUNT(second) END)AS count2
    FROM my_table
    WHERE third IN('0','1')
    GROUP BY field_one
    

    【讨论】:

    • 为什么这里需要 Distinct?
    • 这是一个有趣的替代方案,但是我发现它只会计算两个输出列(count1 或 count2)中的一个,而将另一列设为 NULL。我不完全确定原因,但如果有人知道这将是一个很好的学习技巧。
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多