【发布时间】:2021-11-08 02:03:57
【问题描述】:
我有一张为文章投票的表格。
CREATE TABLE `articlevote` (
`id` int NOT NULL AUTO_INCREMENT,
`articleid` int NOT NULL,
`ipaddress` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`vote` int NOT NULL,
PRIMARY KEY (`id`,`articleid`,`ipaddress`),
UNIQUE KEY `UNIQUEVOTE` (`articleid`,`ipaddress`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=149235 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
对于这个最小的例子,我插入 3 个文章投票
insert into articlevote (id,articleid, ipaddress, vote) values (1,1,"1.2.3.4",1),(2,2,"1.2.3.4",1),(3,1,"1.2.3.5",-1);
列投票:1 = 赞成,-1 = 反对
ipaddress 应该防止双重投票。
我有一个查询要给我点赞最多的文章
SELECT v.articleid, count(v.vote) as votes FROM articlevote v
WHERE v.vote > 0
GROUP BY v.articleid
ORDER BY votes DESC;
但现在我需要获得一份考虑赞成票和反对票的最受欢迎文章的列表。
我试过了
SELECT v.articleid, sum(v.vote) as votes FROM articlevote v
GROUP BY v.articleid
ORDER BY votes DESC;
我希望第 2 条以 1 票位居榜首,第 1 条以 0 票位居第二。 但我得到了第 1 条和第 1 条的总票数。 在大型数据集上,使用 sum 聚合的查询比使用 count 聚合的查询慢得多。
如何在高性能查询中同时获得预期结果?
【问题讨论】:
-
您的代码运行良好:dbfiddle.uk/…
-
您使用的是什么
MySQL版本? -
我使用的是 MySQL 8.0.23。我刚刚更新到 MySQL 8.0.26