1

我有一个数据库,其中包含预先计算的质量分数从 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文章出现在所有10s 之后。

 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的新文章同样值得在那里。

4

3 回答 3

4

您需要根据这两个参数计算相关性分数。如何计算这样的相关性分数将取决于您希望这两个指标如何关联(例如,旧文章变得不那么有趣的比率)。

假设一个人定义了一个存储函数 relevance(score TINYINT UNSIGNED, published DATE) RETURNS INT,那么可以简单地做:

SELECT * FROM posts ORDER BY relevance(score, published)

当然,与其定义存储函数,不如直接在ORDER BY子句中简单地表达计算。

于 2013-07-11T01:46:00.553 回答
3

为此,您将需要一些权重。这是基于黑客新闻算法的。

SELECT *,
(score/power(((NOW()-published)/60)/60,1.8)) as rank
FROM posts ORDER BY rank DESC;
于 2013-07-11T01:49:39.357 回答
1

如果您只想按日期排序,而不是完整的日期时间,那么:

ORDER BY DATE(published) DESC, score DESC;

当然,您可以通过将日期四舍五入为月或周或其他方式来设置较低的日期优先级。

这是SQLFiddle

于 2013-07-11T01:44:37.643 回答