2013-11-02 59 views
0

我有三個與此問題相關的表 - 排名集,項目和投票。 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 

無論出於何種原因,我似乎只能夠得到的最流行的rankset與那。我也試過這個:

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

+0

可以提供sqlfiddle? –

+0

我的不好,它現在在那裏。 – Fibericon

+0

我正在尋找一些數據表 –

回答

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

UPDATE: 的情況下,如果一些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; 
+0

這幾乎是完美的。唯一的情況是,COALESCE()不能按預期工作 - 零票數的項目不會顯示出來。 – Fibericon

+0

你說得對。我通過LEFT JOIN修復了它。請檢查它! –

+0

這是一個小提琴[鏈接](http://sqlfiddle.com/#!2/fedf4/13) –