Mysql 如何计算同一列上具有不同where子句的值?

Mysql 如何计算同一列上具有不同where子句的值?,mysql,sql,count,grouping,medoo,Mysql,Sql,Count,Grouping,Medoo,我讨厌我不得不问,但我就是受不了 我有这个表投票: 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 vi

我讨厌我不得不问,但我就是受不了

我有这个表
投票

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);

如何“添加一列”如“upvots”,即类型为1的条目,以及类型为0的条目?

我认为最简单的方法是对符合条件的每一行求和:

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;

注意,您应该从
分组依据
中省略
类型
,以便为每个视频返回一行。

您可以使用
案例
表达式仅计算您感兴趣的投票类型:

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;
两种变体:

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


太酷了!很有效,非常感谢。有关于表演的笔记吗?是否有一个medoo内置函数用于此功能?性能应该不是问题,但如果不知道表定义、已有的索引以及此表随时间变化的大小,则很难说。我无法与medoo通话。第二个似乎不起作用,我没有收到错误,只是
调用布尔值上的成员函数fetchAll()
可能medoo无法处理:/@Alex medoo与sql无关execution@Alex我已经修好了typo@Alex可能吧?
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