【问题标题】:MySQL: How do you count non empty fields in a row, then count the same values?MySQL:你如何计算一行中的非空字段,然后计算相同的值?
【发布时间】:2011-06-24 22:58:33
【问题描述】:

请记住,我无法对表格进行规范化,所以我必须使用我得到的东西。在表中,行与此类似

name  |  widget1  |  widget2 | widget3 
------+-----------+----------+----------
Joe   |   blue    |   red    |          
Jane  |   green   |          |          
Bob   |   red     |   red    |  green
Susy  |   green   |  green   |   

我想做的是计算小部件的总数(Joe 有 2 个小部件,Jane 有 1 个等),并计算相似小部件的数量(Bob 有 3 个小部件 - 2 个红色和 1 个绿色, Susy 有 2 个小部件 - 2 个绿色等)

这是我计算小部件总数的代码:

SELECT ( 
         SUM( IF(widget1 <> "", 1, 0) ) +
         SUM( IF(widget2 <> "", 1, 0) ) +
         SUM( IF(widget3 <> "", 1, 0) )
       ) AS totalWidgets FROM table

效果很好。但是有没有更好的方法来做到这一点?此外,要计算相似值的数量,我确信我可以做类似的事情,但只需检查值是否相等......但它可能会变得很长而且很复杂。

有没有更直接的方法?

【问题讨论】:

    标签: mysql select count


    【解决方案1】:

    没有测试过,应该可以的

    select name, count(1), SUM(widget = 'red') reds, SUM(widget = 'green') greens, SUM(widget = 'blue') blues
    from
      (
        (SELECT name, widget1 widget FROM table)
       UNION
        (SELECT name, widget2 widget FROM table)
       UNION
        (SELECT name, widget3 widget FROM table)
      )q
    WHERE widget <> ''
    group by name;
    

    全部在一行

    select name, count(1), SUM(widget = 'red') reds, SUM(widget = 'green') greens, SUM(widget = 'blue') blues from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q WHERE widget <> '' group by name;
    

    q 是我们规范化的“表格”(不是真正的表格,但看起来有点像)。

    以这种方式查看我们的规范化表

    select * from ((SELECT name, widget1 widget FROM table) UNION (SELECT name, widget2 widget FROM table) UNION (SELECT name, widget3 widget FROM table))q;
    

    不知道你怎么称呼它,我认为它是一个子查询。 (我已经使用 MySQL 多年,但我仍然不知道正确的名称)

    【讨论】:

    • 太棒了!工作完美。嘻嘻!
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2014-07-27
    • 2019-06-09
    • 1970-01-01
    • 2012-07-09
    • 2022-12-20
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多