mysql - 选择对象中综合得票数前 10% 的集合

标签 mysql

对于一些背景,我之前询问过 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 :

http://sqlfiddle.com/#!2/fe315/9

最佳答案

来自评论:

看看这个答案: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/

相关文章:

php - php/mysql select-from-where 问题中的 "where"子句

mysql - 在 Pentaho 中将字符串转换为带有 "%"特殊字符的整数

php - 使用从 phpmyadmin(MySQL) 派生的 PHP 将图像显示为图库

python - 对于相同的查询,MySQL Workbench 比 Python 快得多

java - 提交表单时出错:Data truncation: Incorrect datetime

php - PDO 选择倍数 count()

mysql - 将表列转换为行并使用一个表中的值(如果它不存在于另一个表中)

mysql - COUNT() MySQL 中 MAX() 出现的次数

mysql - 带有自定义主题+ mysql的Docker-compose wordpress

php - 在 SQL 记录集中使用 IF ELSE