0

この問題に関連する 3 つのテーブル (ランクセット、アイテム、投票) があります。ランクセットは基本的に、「お気に入りのスポーツ」など、アイテムが配置されるカテゴリです。項目は、「野球」など、実際に投票されているものです。投票は、投票自体のログです。私がやりたいことは、最もアクティブな 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

なんらかの理由で、私はそれで最も人気のあるランクセットを1つしか取得できないようです. 私もこれを試しました:

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

4

1 に答える 1

2

あなたの質問はほぼ正しいです。最初のものでは、「GROUP BY ランクセット」を追加するだけです。それを試してください:

    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;
于 2013-11-02T13:17:27.460 に答える