我有三个与此问题相关的表 - 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
答案 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;