【问题标题】:How to count values with different where clauses on the same column?如何计算同一列上具有不同 where 子句的值?
【发布时间】:2017-05-20 09:15:21
【问题描述】:

我讨厌我不得不问,但我无法处理它。

我有这张桌子votes:

type=1 是赞成票,type=0 是反对票

我想要这个输出:

[
  {'video': 'best-of-mehrwert', 'upvote': 2, 'downvote': 0},
  {...}
]

我正在使用 medoo:

<?php
$votes = $database->query(
  // 'SELECT COUNT(video) as votes, video FROM votes GROUP BY video, type'
  '
    SELECT video,COUNT(*) as counts
    FROM votes
    GROUP BY video,type;

  '
)->fetchAll(PDO::FETCH_ASSOC);

echo json_encode($votes);

这给了我

[{"video":"anlaesse","counts":"1"},{"video":"best-of-mehrwert","counts":"2"}]

如何像“upvotes”一样“添加一列”,即 type = 1 和 type = 0 相同的条目?

【问题讨论】:

    标签: mysql sql count grouping medoo


    【解决方案1】:

    我认为SUM 为您的条件匹配的每一行加 1 可能是最简单的:

    SELECT 
        video, 
        SUM(CASE type WHEN 1 THEN 1 ELSE 0 END) as upvotes,
        SUM(CASE type WHEN 0 THEN 1 ELSE 0 END) as downvotes 
    FROM 
        votes
    GROUP BY 
        video;
    

    注意,您应该从 GROUP BY 中省略 type,以便为每个视频返回一行。

    【讨论】:

    • 太酷了!它有效,非常感谢。关于性能的任何说明?是否有可能为此提供 medoo 内置功能?
    • 性能应该不是问题,但是如果不知道您的表定义和您已经拥有的索引以及随着时间的推移该表的大小,就很难说。我不能和 medoo 说话。
    【解决方案2】:

    您可以使用case 表达式仅计算您感兴趣的选票类型:

    SELECT   video, 
             COUNT(CASE type WHEN 1 THEN 1 END) as upvotes
             COUNT(CASE type WHEN 0 THEN 1 END) as downvotes
    FROM     votes
    GROUP BY video, type;
    

    【讨论】:

      【解决方案3】:

      两种变体:

      select
        video,
        sum(case when type=1 then 1 else 0 end) as upvote,
        sum(case when type=0 then 1 else 0 end) as downvote
      from votes
      group by video
      

      和

      select
        video,
        sum(type) as upvote,
        sum(1-type) as downvote
      from votes
      group by video
      

      http://www.sqlfiddle.com/#!9/c73f2a/5

      【讨论】:

      • 第二个好像不行,我没有报错,只是Call to a member function fetchAll() on boolean
      • 可能 medoo 无法处理它:/
      • @Alex medoo 与sql执行无关
      • @Alex 我已修正错字
      • @Alex 聚合可能吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多