Mysql 选择大小写,计数(*)

Mysql 选择大小写,计数(*),mysql,sql,select,max,case,Mysql,Sql,Select,Max,Case,我想选择将某些内容标记为收藏夹的用户数,并返回当前用户是否已“投票”。我的桌子看起来像这样 CREATE TABLE IF NOT EXISTS `favorites` ( `user` int(11) NOT NULL DEFAULT '0', `content` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`user`,`content`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 假设我有3行包含 I

我想选择将某些内容标记为收藏夹的用户数,并返回当前用户是否已“投票”。我的桌子看起来像这样

CREATE TABLE IF NOT EXISTS `favorites` (
`user` int(11) NOT NULL DEFAULT '0',
`content` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY  (`user`,`content`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;
假设我有3行包含

INSERT INTO `favorites` (`user`, `content`) VALUES
(11, 26977),
(22, 26977),
(33, 26977);
用这个

SELECT COUNT(*), CASE
        WHEN user='22'
           THEN 1
           ELSE 0
   END as has_voted
FROM favorites WHERE content = '26977'
我希望得到
has_vote=1
COUNT(*)=3
但是


我得到的
投票数为0
计数(*)为3
。为什么呢?如何修复它?

这是因为您在单个
选择中混合了聚合表达式和非聚合表达式。聚合表达式在许多行上工作;非聚合表达式在一行上工作。当您有一个
分组依据
时,聚合(即
计数(*)和非聚合(即
大小写
)表达式应出现在相同的
选择
中,这在您的情况下没有意义

您可以通过聚合第二个表达式来修复查询,即在其周围添加一个
SUM
,如下所示:

SELECT
    COUNT(*) AS FavoriteCount
,   SUM(CASE WHEN user=22 THEN 1 ELSE 0 END) as has_voted
FROM favorites
WHERE content = 26977
现在这两个表达式都已聚合,因此您应该会得到预期的结果。

您需要投票总数

SELECT COUNT(*), SUM(CASE
        WHEN user='22'
           THEN 1
           ELSE 0
   END) as has_voted
FROM favorites WHERE content = '26977'
试试这个:

SELECT COUNT(*), MAX(USER=22) AS has_voted
FROM favorites 
WHERE content = 26977;
检查

输出

| COUNT(*) | HAS_VOTED |
|----------|-----------|
|        3 |         1 |
使用
SUM()
和不使用
大小写进行尝试

SELECT 
  COUNT(*),
  SUM(USER = '22') AS has_voted 
FROM
  favorites 
WHERE content = '26977' 

您无意中在这里使用了MySQL功能:您聚合结果,只得到一条显示匹配数(聚合函数计数)的结果记录。但是,您还可以在结果行中显示用户(或者更确切地说是在其上构建的表达式)(没有任何聚合函数)。所以问题是:哪个用户?另一个dbms可能会给您一个错误,要求您在GROUP BY或aggregate users中声明用户。MySQL会选择一个随机用户

这里要做的是聚合用户(或者更确切地说是聚合表达式)。使用SUM将用户对请求内容的所有投票相加:

SELECT 
  COUNT(*), 
  SUM(CASE WHEN user='22' THEN 1 ELSE 0 END) as sum_votes
FROM favorites 
WHERE content = '26977';

您忘记将
CASE
语句包装在聚合函数中。在这种情况下,
has_vote
将包含意外的结果,因为您实际上正在执行“部分分组”。以下是您需要做的:

SELECT COUNT(*), SUM(CASE WHEN USER = 22 THEN 1 ELSE 0 END) AS has_voted
FROM favorites
WHERE content = 26977
或:


这是一个使用MySQL特性检索布尔表达式结果的好例子。给出了这个问题的一个很好的解决方案。如果你不仅给出了一个有效的解决方案,而且还解释了daker的错误,你的答案会很好。但我投了我的票,我认为这是最好的解决方案。
SELECT COUNT(*), COUNT(CASE WHEN USER = 22 THEN 1 ELSE NULL END) AS has_voted
FROM favorites
WHERE content = 26977