我有一个数据库,其中包含预先计算的质量得分从0到10(其中10是最佳质量)的文章,每篇文章都有一个公布的日期。
以下是一个示例数据库架构。
CREATE TABLE `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` longtext NOT NULL,
`score` int(10) unsigned NOT NULL DEFAULT '0',
`published` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=357 DEFAULT CHARSET=latin1;
如何订购最新且得分最高的文章?
例如,以下内容不起作用,因为它将所有得分的10
文章放在首位,即使它们已经很老了。所有9
s后都会显示最新得分的10
文章。
SELECT * FROM posts ORDER BY score DESC, published DESC;
如果我按照首先发布的顺序进行排序,那么得分值无效,因为所有发布的时间都是唯一的。
SELECT * FROM posts ORDER BY published DESC, score DESC;
我需要以某种方式订购这些记录,以便更高的得分文章排在第一位,但将它们放在列表中较低的位置。
以下是我制作的一些快速示例数据。
INSERT INTO `articles` (`title`, `content`, `score`, `published`) VALUES ('Test', 'Test', '10', '2013-07-09 21:25:43');
INSERT INTO `articles` (`title`, `content`, `score`, `published`) VALUES ('Test', 'Test', '5', '2013-07-08 13:34:12');
INSERT INTO `articles` (`title`, `content`, `score`, `published`) VALUES ('Test', 'Test', '10', '2013-07-07 20:17:02');
INSERT INTO `articles` (`title`, `content`, `score`, `published`) VALUES ('Test', 'Test', '9', '2013-02-12 10:32:11');
INSERT INTO `articles` (`title`, `content`, `score`, `published`) VALUES ('Test', 'Test', '10', '2006-01-01 01:05:13');
如果您按SCORE DESC, published DESC
订购该日期,那么我会在文章评分为2006-01-01
之前出现9
的文章,但它的日期更早。
这篇旧文章的意思是在网站的首页上,当得到9
的新文章同样值得参与时。
答案 0 :(得分:4)
您需要根据这两个参数计算相关性分数。如何计算这样的相关性分数将取决于您希望两个指标相关联的方式(例如,旧文章变得不那么有趣的速率)。
假设有人定义了一个stored function relevance(score TINYINT UNSIGNED, published DATE) RETURNS INT
,那么可能只会这样做:
SELECT * FROM posts ORDER BY relevance(score, published)
当然,不是定义存储函数,而是可以直接在ORDER BY
子句中表达计算。
答案 1 :(得分:3)
你需要一些加权。这个基于Hacker News Algorithm。
SELECT *,
(score/power(((NOW()-published)/60)/60,1.8)) as rank
FROM posts ORDER BY rank DESC;
答案 2 :(得分:1)
如果您只想按日期排序,而不是完整的日期时间:
ORDER BY DATE(published) DESC, score DESC;
当然,您可以通过将日期舍入到月份或周或其他任何内容来设置较低的日期优先级。