【问题标题】:How to make a query where some rows are counted multiple times?如何在某些行被多次计算的情况下进行查询?
【发布时间】:2012-06-28 13:37:57
【问题描述】:

我有一张这样的桌子

gems
----------
id, color
1 , green
2 , green
3 , blue
4 , red
5 , red
6 , red
7 , rainbow  <<<<< OMNI COLOR
8 , rainbow  <<<<< OMNI COLOR

我正在尝试得到这样的结果

color count,   each rainbow is added to each color
---------------
color , count
green , 4
blue , 3
red , 5

我一直在尝试加入和分组的各种组合,但我不知道如何解决这个问题。在这个例子中,每个正常颜色应该只计算一次,但每个彩虹宝石需要计算多次,而在真正的问题中,有 X 个不同的“颜色”

【问题讨论】:

    标签: mysql join group-by


    【解决方案1】:
    SELECT `color`, (count(*) + rb.`cnt`) AS `count`
    FROM gems,
         (SELECT COUNT(*) AS `cnt` FROM gems WHERE color='rainbow') AS rb
    GROUP BY `color`
    HAVING `color`<>'rainbow'
    

    Here 是显示查询工作的小提琴。

    【讨论】:

    • @eggyal 在他展示的示例中,也没有“彩虹”的条目。
    • @Sirko 我取消了我的反对票 :) 我试图想出一种没有子查询的方法,但到目前为止失败了。
    • 我得到的印象是他想要一些颜色,然后将彩虹的数量添加到所有颜色中。
    • @eggyal 或只使用HAVING 子句。在设置 sqlfiddle 时也看到了那个。
    【解决方案2】:

    您希望使用计算彩虹数量的子查询连接您的表,然后对结果进行分组:

    SELECT   color,
             COUNT(*) + t.rainbows AS count
    FROM     gems
      JOIN (SELECT COUNT(*) AS rainbows FROM gems WHERE color = 'rainbow') AS t
    WHERE    color <> 'rainbow'
    GROUP BY color
    

    sqlfiddle 上查看。

    【讨论】:

    • 这些也不是我的实际表名和列名;p
    猜你喜欢
    • 2018-05-21
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2021-09-03
    • 2012-01-28
    相关资源
    最近更新 更多