【问题标题】:Retrieving sets with highest number of combined votes among objects检索对象中组合投票数最多的集合
【发布时间】:2013-11-02 11:48:19
【问题描述】:

我有三个与这个问题相关的表——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

【问题讨论】:

  • 可以提供sqlfiddle吗?
  • 我的错,它现在就在那里。
  • 我正在寻找包含一些数据的表格

标签: mysql select


【解决方案1】:

您的查询几乎是正确的。在第一个中,您应该只添加“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

更新: 某个rankset没有票的情况:

    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;

【讨论】:

  • 这几乎是完美的。唯一的问题是,COALESCE() 没有按预期工作 - 零票的项目不会出现。
  • 你是对的。我已经通过 LEFT JOIN 修复了它。请检查一下!
  • 做到了!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2018-12-31
  • 2018-04-13
相关资源
最近更新 更多