假设我有一个这样的表(这只是一个简化的例子,我所说的真实表格要复杂得多):
CREATE TABLE media (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
voted INT NOT NULL DEFAULT 0,
rating FLOAT NOT NULL DEFAULT 0
) ENGINE = INNODB;
投票列表示该项目已收到的投票数,评级列表示该项目的总评分。
现在,我想要做的是根据id从表中选择一个项目,例如:
SELECT m.* FROM media AS m WHERE id = 5;
但是,此外,我想根据 rating 列计算此行的位置,并将其作为附加列获取,假设称为site_rank(因此,该等级的值越大row是site_rank会越高,我希望我解释得很好)。我猜这可以通过子选择查询来实现,但我不知道该怎么做。
任何帮助?
答案 0 :(得分:2)
这将为大多数投票媒体输出高rank
。
如果您希望投票最多的人排名较低(例如,投票最多的人获得rank
的{{1}}),只需反转子查询中的符号。
1
答案 1 :(得分:2)
SELECT count(*) FROM media WHERE rating > (SELECT rating FROM media WHERE id = 5);
答案 2 :(得分:1)
SELECT
m1.*,
(SELECT COUNT(*) FROM media AS m2 WHERE m2.rating > m1.rating) AS site_rank
FROM
media AS m1
WHERE
id = 5;
请注意,这并未定义完整的排序,因为可能会有相同评级的项目,并且他们会报告相同的网站排名。
答案 3 :(得分:1)
MySQL是否支持标准的SQL rank()函数?它完全符合您的要求。
select
*,
rank() over (
order by rating desc
) as site_rank
from media