この問題に関連する 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