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