检索具有最大组合投票数的集合

时间:2013-11-02 11:48:19

标签: mysql select

我有三个与此问题相关的表 - rankset,item和vote。 Rankset基本上是项目所在的类别,例如“最喜欢的运动”。项目实际上是投票,例如“棒球”。投票是投票本身的日志。我想要做的是在页面上显示25个最活跃的排名集。这是表格本身的样子:

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

这是我到目前为止所尝试的:

SELECT rankset.*, COALESCE(COUNT(vote.id), 0) AS votes 
   FROM rankset, item, vote 
   WHERE rankset.id = item.rankset 
   AND vote.item = item.id ORDER BY votes DESC LIMIT 25

无论出于何种原因,我似乎只能获得最受欢迎的单一排名。我也试过这个:

SELECT rankset.*, COALESCE(COUNT(vote.id), 0) AS votes 
   FROM rankset, vote, item 
   WHERE item.rankset = rankset.id 
   GROUP BY rankset ORDER BY votes DESC LIMIT 25

但这似乎完全忽略了“ORDER BY”部分。什么是正确的方法呢?

编辑:这是小提琴:http://sqlfiddle.com/#!2/b57ac

1 个答案:

答案 0 :(得分:2)

您的查询几乎是正确的。在第一个中你应该添加'GROUP BY rankset'。试试这个:

    SELECT rankset.*, COALESCE(COUNT(vote.id), 0) AS votes
      FROM rankset, item, vote 
    WHERE rankset.id = item.rankset 
      AND vote.item = item.id 
    GROUP by rankset.id 
    ORDER BY votes DESC 
    LIMIT 25;

这是小提琴:http://sqlfiddle.com/#!2/fe315/9

更新: 如果一些排名没有任何投票的情况:

    SELECT rankset.*, COALESCE(COUNT(vote.id), 0) AS votes
       FROM rankset, item
       LEFT JOIN vote ON (vote.item = item.id)
       WHERE rankset.id = item.rankset 
       GROUP by rankset.id 
       ORDER BY votes DESC 
       LIMIT 25;