对于一些背景,我之前询问过 retrieving sets with highest number of combined votes among objects 。这对于获得前 25 名非常有用,但现在我想获得前 10%,按排名集的时间戳排序。以下是相关表格:
CREATE TABLE IF NOT EXISTS `rankset` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` TEXT NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `item` (
`id` BIGINT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(128) NOT NULL ,
`rankset` BIGINT NOT NULL ,
`image` VARCHAR(45) NULL ,
`description` VARCHAR(140) NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `mydb`.`vote` (
`id` BIGINT NOT NULL AUTO_INCREMENT ,
`value` TINYINT NOT NULL ,
`item` BIGINT NOT NULL ,
`user` BIGINT NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
我会列出到目前为止我尝试过的内容,但老实说,我什至不知道从哪里开始。这是 SQL fiddle :
最佳答案
来自评论:
看看这个答案:https://stackoverflow.com/a/4474389/97513 ,他生成一列用于其项目的排名,使用使用 rank <= (SELECT COUNT(1) / 10 FROM rankset)
的 WHERE 子句确定前 10%。
我整理了一个 SQL fiddle 来演示:http://sqlfiddle.com/#!2/fe315/21 - 这是另一个包含更多结果的结果,因此当您添加更多行时您可以看到它会扩大:http://sqlfiddle.com/#!2/a02ea/1
使用的 SQL:
SET @rn := 0;
SELECT (@rn:=@rn+1) AS rank, q.*
FROM (
SELECT rankset.*, COALESCE(COUNT(vote.id), 0) AS votes
FROM rankset, vote, item
WHERE item.rankset = rankset.id
AND vote.item = item.id
GROUP BY rankset.id
ORDER BY votes DESC
) q
WHERE
@rn <= (SELECT COUNT(1)/10 FROM rankset);
关于mysql - 选择对象中综合得票数前 10% 的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24119299/