我想选择已将某些内容标记为收藏的用户数,如果当前用户是否已“投票”,也要返回。我的桌子看起来像这样
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_voted=1
,COUNT(*)=3
但是
我得到的has_voted=0
和COUNT(*)=3
。这是为什么?如何解决?
这是因为您将聚合表达式和非聚合表达式混合在一个中SELECT
。聚合表达式可在许多行上工作;非聚合表达式在单个行上工作。聚合(即COUNT(*)
)和非聚集的(即CASE
)表达式应该出现在同一个SELECT
,当你有一个GROUP BY
,这没有任何意义在你的情况。
您可以通过汇总第二个表达式来修复查询-即SUM
在其周围添加一个,如下所示:
SELECT
COUNT(*) AS FavoriteCount
, SUM(CASE WHEN user=22 THEN 1 ELSE 0 END) as has_voted
FROM favorites
WHERE content = 26977
现在,两个表达式都已汇总,因此您应该获得预期的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句