【问题标题】:MySQL - One SQL request instead two (both request include diffrent COUNT(*)MySQL - 一个 SQL 请求而不是两个(两个请求都包括不同的 COUNT(*)
【发布时间】:2013-09-19 11:48:39
【问题描述】:

我再一次需要你的帮助;)。我有很多数据,mysql请求越来越慢,所以我需要的需求请求我想在一个命令中分组。

我的示例数据库结构:

|product|opinion (pos/neg)|reason|
__________________________________
|milk   | pos             | good |
|milk   | pos             |fresh |
|chocolate| neg           | old  |
|milk   | neg             | from cow|

所以我需要有关它的所有不同产品(GROUP BY)计数的信息,以及每个产品的 pos 意见计数。我想要这样的输出:

|product|count|pos count|
_________________________
|milk   |  3  | 2       |
|chocolate| 1 |  0      |

我希望我的解释足够好 ;) 还是去上班:我写了两条命令

SELECT COUNT(*) as pos count FROM table WHERE product = "milk" AND opinion = "pos" GROUP BY `opinion`

第二个

SELECT product, COUNT(*) FROM table GROUP BY `product`

我不知道如何加入这两个请求,也许这是不可能的?在我的实际使用代码中,我有额外的类别列,我也在第二个命令中使用 WHERE

【问题讨论】:

    标签: mysql sql select group-by


    【解决方案1】:
    select product, 
           count(*) as total_count
           sum(
             case when opinion='pos' then 1 
             else 0 end
           ) as pos_count
    from the_table
    group by product;
    

    【讨论】:

    • 谢谢!就是这样;)!
    【解决方案2】:
    SELECT  product,
            COUNT(*) TotalCount,
            SUM(opinion = 'pos') POSCount
    FROM    tableName
    GROUP   BY product
    

    SUM(opinion = 'pos')MySQL 特定语法,它根据布尔算术的结果计算结果的总数。如果你想让它成为更多的 RDBMS 朋友,请使用CASE

    SUM(CASE WHEN opinion = 'pos' THEN 1 ELSE 0 END)
    

    【讨论】:

    • 谢谢!就是这样,我不能将此答案标记为我已接受,但是当我有足够的代表时,我会投票;)
    • 另一个不是 MySQL 特定的简短语句:COUNT(NULLIF(opinion,'pos'))。我还是更喜欢更容易理解的长版本:-)
    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 2019-10-02
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多